簡體   English   中英

檢查通用類型的字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM