[英]Checking a field of a generic type
public static int GetResult<TType>(TType aObject) {
if(aObject.mValue==12)
return 99;
return 20;
}
我如何檢查TType的mValue字段,我猜想可能是反射的原因,但是我不確定如何處理?
謝謝。
當您要保留強大的類型輸入和編譯時安全性時,泛型很有用。 如果您要求助於Reflection,則無需使用泛型。 因此,一種方法是定義一個包含此屬性的接口或基類:
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,它將在運行時失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.