-2

我的班级有一个 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 返回类型,它按预期工作。

4

5 回答 5

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);
    }
}
于 2013-08-07T08:43:38.783 回答
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");

这很好用

于 2013-08-07T08:39:21.073 回答
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");
    }
}
于 2013-08-07T08:56:35.917 回答
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; 
      }
}
于 2013-08-07T08:45:36.400 回答
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");
于 2013-08-07T08:44:10.900 回答