我可以通过属性隐式创建成员变量吗?
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。
我想创建一个接受 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。