如何验证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返回类型,它按预期工作。
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");