C# 如何验证函数是否为<&燃气轮机;属性是否已初始化?

C# 如何验证函数是否为<&燃气轮机;属性是否已初始化?,c#,.net,c#-4.0,C#,.net,C# 4.0,我的类有一个Func属性,如下所示 public class ClassA { public Func<string, IClassB> MyProperty { get; set; } } 对于常规属性,而不是Func返回类型,它可以按预期工作。ClassA clsA=new ClassA(); ClassA clsA = new ClassA(); if (clsA.MyProperty == null) Messa

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

public class ClassA {

  public Func<string, IClassB> MyProperty { get; set; }
}
对于常规属性,而不是Func返回类型,它可以按预期工作。

ClassA clsA=new ClassA();
        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");
if(clsA.MyProperty==null) MessageBox.Show(“IsNull”); clsA.MyProperty=newfunc(x=>x.Equals(“1”); 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);
    }
}
公共类ClassA
{
私有只读Func myFunc;
公共类别A(Func myFunc)
{
this.myFunc=myFunc;
}
公共IClassB MyFunc(字符串输入)
{
如果(this.myFunc=null)
{
返回null;
}
返回此.myFunc(输入);
}
}

您可以通过以下标准方式进行检查:

   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");
IClassB a=新的IClassB();
//它现在为空,因此随后将为空
如果(a.MyProperty==null)Console.WriteLine(“空”);
else控制台。WriteLine(“非空”);
a、 MyProperty=new Func((s)=>{return new IClassB();});
//它现在不为空,因此后面将显示not empty
如果(a==null)Console.WriteLine(“空”);
else控制台。WriteLine(“非空”);

除了其他答案外,您可以使用
函数的属性(如果您希望/可以在ClassA中测试此属性):

公共类ClassA{
私有财产;
公共函数MyProperty{
得到{
如果(myProperty==null)
返回一些默认行为;
归还我的财产;
} 
集合{
myProperty=值;
}
}

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

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");
    }
}
类程序
{
接口IClassB{}
类别B1:IClassB{}
类ClassB2:IClassB{}
甲级
{
公共职能
MyProperty{get;set;}
}
静态void Main(字符串[]参数)
{
var classA=新的classA();
Console.WriteLine((classA.MyProperty==null)
?“未初始化”:“已初始化”);
classA.MyProperty=(a)=>
{
如果(a=“1”)
返回新的ClassB1();
否则,如果(a==“2”)
返回新的ClassB2();
其他的
返回null;
};
Console.WriteLine((classA.MyProperty==null)
?“未初始化”:“已初始化”);
对象
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”);
}
}

通过某种方式初始化,你是指源代码中的某个地方吗?嗯,有Roslyn…虽然,使用has was意味着在过去存在一个已更改的状态,因此是某种执行线程。请提供更多详细信息。为什么你不能简单地
MyProperty==null
?为什么不可能检查MyProperty的null值?I如果MyProperty是一个事件,那么您是对的。您不能在类外进行检查!
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; 
      }
}
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");
    }
}