Как автоматически привести значение, полученное из FieldInfo.GetValue, к правильному типу? - PullRequest
1 голос
/ 29 августа 2011

Если у меня есть несколько экземпляров 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.

Ответы [ 3 ]

5 голосов
/ 29 августа 2011

Если вы используете 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);
1 голос
/ 29 августа 2011

Вам нужно вызвать Write, используя отражение, чтобы найти правильную перегрузку во время выполнения, а не во время компиляции:

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

Если вы используете C # 4, вы также можете просто использовать dynamic:

binaryWriter.Write((dynamic)value);
0 голосов
/ 29 августа 2011

динамическое ключевое слово будет работать здесь

binaryWriter.Write((dynamic)value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...