检查泛型类型的字段

本文关键字:字段 泛型类型 检查 | 更新日期: 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,它将在运行时失败