簡體   English   中英

從 c# 中的 FieldInfo.GetValue 動態轉換對象

[英]Dynamically casting objects from FieldInfo.GetValue in c#

我正在嘗試遍歷 class 實例中的所有字段並提取它們的名稱/數據。 字段本身是自定義類的實例,用於存儲具有我需要的某些特定功能的數據。 以下作品:

        foreach (var v in typeof(CentralParams).GetFields())
        {

            if(v.GetValue(_centralParams).GetType() == typeof(BoolEventProperty))
            {
                BoolEventProperty prop = (BoolEventProperty) v.GetValue(_centralParams);
                print(v.Name + "   " + prop.Value);
            }
            
            if(v.GetValue(_centralParams).GetType() == typeof(FloatEventProperty))
            {
                FloatEventProperty prop = (FloatEventProperty) v.GetValue(_centralParams);
                print(v.Name + "   " + prop.Value);
            }
            
            if(v.GetValue(_centralParams).GetType() == typeof(IntEventProperty))
            {
               IntEventProperty prop = (IntEventProperty) v.GetValue(_centralParams);
               print(v.Name + "   " + prop.Value);
            }

        }

但是,我必須在字段中手動檢查 object 的類型,然后將其轉換為該類型的新實例以訪問 Value 成員。 這很煩人,因為每次我向 CentralParams class 添加新數據類型時,我都必須在這里明確處理它。

有沒有辦法可以動態地將其轉換為正確類型的空變量?

v.GetValue(_centralParams).GetType()返回我需要的類型,所以看起來應該是可能的。

類似的東西

            var type = v.GetValue(_centralParams).GetType();

            var prop = (type)v.GetValue(_centralParams);

謝謝

從 C# 8.0 開始,您可以使用模式匹配 像這樣的東西:

foreach (var v in typeof(CentralParams).GetFields())
{
    var property = v.GetValue(_centralParams);
    var value = property switch
    {
        BoolEventProperty prop => $"{prop.Value} from bool",
        FloatEventProperty prop => $"{prop.Value} from float",
        IntEventProperty prop => $"{prop.Value} from int",
        _ => throw new InvalidOperationException($"Unknown type {property?.GetType()}")
    };

    print(v.Name + "   " + value);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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