如何验证Func<>物业已初始化?

时间:2013-08-07 08:35:21

标签: c# .net c#-4.0

我的班级有一个Func属性,如下所示。

public class ClassA {

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

无法检查MyProperty是否为空。因此,我的问题是,是否可以验证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返回类型,它按预期工作。

5 个答案:

答案 0 :(得分:1)

        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");

这非常好

答案 1 :(得分:1)

如果我接受你的代码并且

 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);
    }
}

答案 2 :(得分:0)

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

   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");

答案 3 :(得分:0)

除了其他答案之外,你可以使用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; 
      }
}

答案 4 :(得分:0)

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

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");
    }
}