如何通过添加属性,在未初始化的情况下访问属性时发出警告

本文关键字:属性 访问 情况下 警告 初始化 添加 何通过 | 更新日期: 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