如何验证Func<>;属性已初始化

本文关键字:gt lt 属性 初始化 Func 何验证 验证 | 更新日期: 2023-09-27 18:26:39

我的类上有一个Func属性,如下所示。

public class ClassA {
  public Func<string, IClassB> MyProperty { get; set; }
}

无法检查MyProperty是否为null。因此,我的问题是,是否可以验证MyProperty已以某种方式初始化?

编辑:我没有给你我的全部照片,因为我认为这对Func来说是完全一样的。抱歉。

问题是,我实际上是在使用反射来实例化属性,在此之前,我只在未实例化时才获取MyProperty的值来设置它。

...
var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var property in properties)
{
if (Attribute.IsDefined(property,typeof(WireAttribute)))
{
var propertyValue = property.GetValue(objectToWire, null);
if (propertyValue == null)  //<-- THIS IS NOT TRUE FOR FUNC RETURN TYPES
...

对于常规属性,而不是Func返回类型,它按预期工作。

如何验证Func<>;属性已初始化

        ClassA clsA = new ClassA();
        if (clsA.MyProperty == null)
            MessageBox.Show("IsNull");
        clsA.MyProperty = new Func<string, bool>(x => x.Equals("1"));
        MessageBox.Show(clsA.MyProperty == null ? "IsNull" : "IsNotNull");

这工作得很好

如果我接受你的代码并进行

 var a = new ClassA();
 var initialized = a.MyProperty == null;

该代码完全有效。因此,您的断言不正确,可以检查null


你想实现什么,也许你想要这样的东西。

public class ClassA
{
    private readonly Func<string, IClassB> myFunc;
    public ClassA(Func<string, IClassB> myFunc)
    {
        this.myFunc = myFunc;
    }
    public IClassB MyFunc(string input)
    {
        if (this.myFunc = null)
        {
            return null;
        }
        return this.myFunc(input);
    }
}

在运行时,您可以检查属性是否已初始化。不能检查的是它的调用返回的值,因为调用是动态的。

class Program
{
    interface IClassB { }
    class ClassB1 : IClassB { }
    class ClassB2 : IClassB { }
    class ClassA
    {
        public Func<string, IClassB>
            MyProperty { get; set; }
    }
    static void Main(string[] args)
    {
        var classA = new ClassA();
        Console.WriteLine((classA.MyProperty == null)
            ? "Not initialized" : "Initialized");
        classA.MyProperty = (a) =>
        {
            if (a == "1")
                return new ClassB1();
            else if (a == "2")
                return new ClassB2();
            else
                return null;
        };
        Console.WriteLine((classA.MyProperty == null)
            ? "Not initialized" : "Initialized");
        object
            c1 = classA.MyProperty.Invoke("1"),
            c2 = classA.MyProperty.Invoke("2"),
            c3 = classA.MyProperty.Invoke("3");
        Console.WriteLine((c1 != null) ? c1.GetType().Name : "null");
        Console.WriteLine((c2 != null) ? c2.GetType().Name : "null");
        Console.WriteLine((c3 != null) ? c3.GetType().Name : "null");
    }
}

除了其他答案外,您可以使用Func的属性(如果您想/可以在ClassA中测试):

public class ClassA {
   private Func<string, IClassB> myProperty;
   public Func<string, IClassB> MyProperty { 
      get {
          if (myProperty == null)
             return some default behaviour;
          return myProperty;
      } 
      set { 
          myProperty = value; 
      }
}

您可以通过标准方式进行检查,例如:

   IClassB a = new IClassB();
   //it is null now so Empty will follow
   if (a.MyProperty == null) Console.WriteLine("Empty");
   else Console.WriteLine("Not empty");
   a.MyProperty = new Func<string, IClassB>((s)=>{ return new IClassB(); });
   //it is not null now so Not empty will follow
   if (a == null) Console.WriteLine("Empty");
   else Console.WriteLine("Not empty");