我可以通过属性隐式创建成员变量吗?

Can I implicitly create member variables via attributes?

我想创建一个接受 Type 参数的 C# 属性。

[MyAttribute(typeof(FooBar))]
public class MyClass
    {

将此属性添加到 class 应该隐含地告诉 Visual Studio 此 class 具有该类型的成员变量,名称派生自该类型.

例如添加参数为typeof(FooBar)的属性应该隐式创建成员变量private FooBar _foobar;.

我希望能够通过 IDE 中的自动完成功能访问该成员,所以在运行时这样做就太晚了。

这可能吗?我怎样才能做到这一点?

在编译器完成它的工作后,并非没有重写 IL 的东西。

除了 .NET 中内置并由编译器专门处理的一小部分属性外,属性根本不会影响代码,它们只是存储在最终程序集中的元数据。

一种方法是使用像 Postsharp 这样的东西,它可以完成我上面描述的事情。

基本上,Postsharp 和类似系统将 .NET 编译器生成的最终程序集分开,读取元数据(属性和其他内容),然后从头开始重建程序集,根据这些属性注入更多代码。

但是,对于现有的 .NET 和 C#,不,这是不可能的。


正如 @MarcinJuraszek 评论的那样,这对于 Microsoft 将要推出的新编译器平台 Roslyn 来说是可能的。我对此经验不足,所以我的回答与当前的稳定版本有关,其中包括 .NET 4.5 和 C# 5.0。