检查泛型类型的字段
本文关键字:字段 泛型类型 检查 | 更新日期: 2023-09-27 17:50:40
public static int GetResult<TType>(TType aObject) {
if(aObject.mValue==12)
return 99;
return 20;
}
我如何检查TType的字段mValue,我猜反射可能会进入这个,但我不确定如何?
谢谢。
泛型在希望保持强类型和编译时安全性时非常有用。如果您打算使用反射,则无需使用泛型。因此,一种方法是定义一个包含以下属性的接口或基类:
public interface IFoo
{
int Value { get; set; }
}
,然后对类型有一个泛型约束:
public static int GetResult<TType>(TType aObject) where TType: IFoo
{
if(aObject.Value == 12)
{
return 99;
}
return 20;
}
下面是我使用的一个模式:
首先创建一个接口:
IFoo
{
int mValue {get; }
}
然后是实现接口
的"adhoc"类AdHocIFoo : IFoo
{
Func<int> get_mValue;
public AdHocIFoo(Func<int> getValue)
{
this.get_mValue = getValue;
}
public int mValue { get { return get_mValue(); } }
}
如果你有像这样定义的类型,比如Bar和Person:
class Bar
{
public int Baz { get; set; }
}
class Person
{
public int ID {get; set; }
}
然后可以使用类似下面的代码;
var bar = new Bar() { Baz = 3 };
var per = new Person() { ID = 43 };
var foo1 = new AdHocIFoo(x => bar.Baz);
var foo2 = new AdHocIFoo(x => per.ID);
var result1 = GetResult<AdHocIFoo>(foo1);
var result2 = GetResult<AdHocIFoo>(foo2);
您需要使用'where'关键字将TType限制为您知道具有mValue字段的类型或接口。
如果你不想这样做,你可以使用dynamic关键字例如
dynamic value= aObject
if (value.mValue == 12)
return 99;
return 20;
但这应该是最后的手段,因为如果你的对象没有mValue,它将在运行时失败