如何通过添加属性,在未初始化的情况下访问属性时发出警告
本文关键字:属性 访问 情况下 警告 初始化 添加 何通过 | 更新日期: 2023-09-27 18:21:31
我想要一些技术来自动替换以下代码:
[WarnIfGetButUninitialized]
public int MyProperty {get; set; }
有了这个:
/// <summary>
/// Property which warns you if its value is fetched before it has been specifically instantiated.
/// </summary>
private bool backingFieldIsPopulated = false;
private int backingField;
public int MyProperty {
get
{
if (backingFieldIsPopulated == false)
{
Console.WriteLine("Error: cannot fetch property before it has been initialized properly.'n");
return 0;
}
return backingField;
}
set {
backingField = value;
backingFieldIsPopulated = true;
}
}
我更喜欢在编译时工作的解决方案,因为反射很慢。
我知道面向方面编程(AOP)会做到这一点(例如PostSharp和CciSharp),但如果有其他方法可以实现这一点,我会感兴趣。
更新
请参阅如何使用PostSharp在初始化属性之前对其进行访问时发出警告?它有一个链接到一些示例代码,该代码演示了使用PostSharp的技术。
属性只需向类和类成员添加元数据,它们本身什么都不做。
对装饰成员所做的操作是通过反射完成的——在一些现有工具中对此有一些支持,但对自定义属性没有这样的支持。
简而言之,如果编译器还不支持属性,就不能在编译时检查它
但是,您可以创建自己的代码片段,使此类代码更易于编写和创建。
T4模板可以用于代码生成。我还没有实现我自己,但T4模板用于C#中的代码生成。scott hanselman 的更多信息
http://www.hanselman.com/blog/T4TextTemplateTransformationToolkitCodeGenerationBestKeptVisualStudioSecret.aspx
只有一些属性通过编译进行检查。ObsoleteAttribute和ConditionalAttribute就是其中的两个。使用Resharper,您可以得到这样的警告。我不知道还有什么其他工具可以做到这一点。
您可以执行类似于.NET的Lazy的实现,但在使用该属性时,这需要更多的文字。类似于这个非线程安全的例子:
public class WarnIfGetButUninitialized<T>
{
T _property;
public T Value
{
get
{
if(_property == null)
{
Console.WriteLine("Error: cannot fetch property before it has been initialized properly.'n");
return default(T);
}
return _property;
}
set { _property = value; }
}
}
来自PostSharp论坛上的Gael Fraiteur(感谢Gael!):
您必须使用LocationInterceptionAspect来实现IInstanceScopedAspect。字段"backingFieldIsPopulated"变为该方面的领域。
你可以在这个例子中找到灵感:
http://doc.sharpcrafters.com/postsharp-2.1/Content.aspx/PostSharp-2.1.chm/html/d3631074-e131-467e-947b-d99f348eb40d.htm