簡體   English   中英

如何自動將從FieldInfo.GetValue獲得的值轉換為正確的類型?

[英]How do I automatically cast a value obtained from FieldInfo.GetValue to the correct type?

如果我有一堆FieldInfo實例,並且我已經知道它們的FieldType是可以傳遞給BinaryWriter.Write(...)的類型之一,那么如何自動將給定對象的字段傳遞給BinaryWriter.Write(...)沒有針對一組類型測試FieldType並手動強制轉換為匹配的類型?

例如,我如何避免必須執行以下操作:

object value = fieldInfo.GetValue(foo);
if (fieldInfo.FieldType == typeof(int))
{
    binaryWriter.Write((int)value);
}
// followed by an `else if` for each other type.

更新:

應該說,我想針對.NET 2.0進行此操作,理想情況下不使用C#3.0中沒有的任何功能。

如果您使用的是C#4,最簡單的方法是使用動態類型並將其分類:

dynamic value = fieldInfo.GetValue(foo);
binaryWriter.Write(value);

假設您總是只想調用binaryWriter.Write的重載。 另一種選擇是使用一個字典,從值的類型到“如何處理”:

static readonly Dictionary<Type, Action<object, BinaryWriter>> Actions = 
    new Dictionary<Type, Action<object, BinaryWriter>>
{
    { typeof(int), (value, writer) => writer.Write((int) value) },
    { typeof(string), (value, writer) => writer.Write((string) value) },
    // etc
};

然后:

object value = fieldInfo.GetValue(foo);
Actions[value.GetType()](value, binaryWriter);

您需要使用反射調用Write以在運行時而不是編譯時找到正確的重載:

typeof(BinaryWriter).InvokeMember(
    "Write", 
    BindingFlags.InvokeMethod, 
    null,
    binaryWriter,
    new object[] { value }
);

如果您使用的是C#4,則還可以使用dynamic

binaryWriter.Write((dynamic)value);

動態關鍵字將在這里工作

binaryWriter.Write((dynamic)value);

暫無
暫無

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

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