Это довольно сложно.Проблема в том, что var
не означает «вариант».Это действует больше как временный заполнитель, который C # заполняет фактическим типом, как только информация о типе может быть выведена из выражения.unboxedData
все еще очень сильно типизированная переменная.Просто компилятор пытается выяснить тип, а не явно указывать его.Крайне важно отметить, что типизация по-прежнему происходит во время компиляции, а не во время выполнения.
Если вы хотите динамически приводить объект во время выполнения, вы не сможете использовать var
или любое другое.спецификатор другого конкретного типа.
Ваши параметры ограничены одним из двух возможных объявлений:
На основео том, что я думаю , что вы хотите сделать с unboxedData
Я подозреваю, dynamic
- это маршрут, по которому вы хотите идти, потому что он позволит вам вызывать любой метод для цели Type
.
Итак, вот что я придумал.
public void FooBar(object value, Type expected)
{
dynamic unboxedData = expected.FromObject(value);
unboxedData.CallSomeMethodDefinedInTheTargetType(); // This will work.
}
Для этого требуется следующий метод расширения.
public static class TypeExtension
{
public static object FromObject(this Type target, object value)
{
var convertable = value as IConvertible;
if (convertable != null)
{
return convertable.ToType(target, null);
}
Type type = value.GetType();
if (target.IsAssignableFrom(type))
{
return value;
}
MethodInfo[] methods = type.GetMethods(BindingFlags.Static | BindingFlags.Public);
foreach (MethodInfo mi in methods)
{
if (mi.ReturnType == target)
{
try
{
return mi.Invoke(null, new object[] { value });
}
catch (TargetInvocationException caught)
{
if (caught.InnerException != null)
{
throw caught.InnerException;
}
throw;
}
}
}
throw new InvalidCastException();
}
}
Приведение будет работать, если выполнено одно из следующих действий.
- Преобразуемое значение реализует
IConvertible
и имеет путь преобразования к целевому типу. - Преобразуемое значение подклассов целевого типа.
- Значениебыть преобразованным определяет явное преобразованиеator в объявлении класса.