Jest to dość trudne. Problem polega na tym, że var
nie oznacza "wariantu". Działa to bardziej jak tymczasowy symbol zastępczy, który C# wypełnia rzeczywistym typem, gdy informacje o typie można wywnioskować z wyrażenia. unboxedData
jest nadal bardzo mocno wpisaną zmienną. Jest to po prostu kompilator próbuje dowiedzieć się typ zamiast go wyraźnie określając go. Ważne jest, aby pamiętać, że pisanie nadal występuje w czasie kompilacji, a nie w czasie wykonywania.
Jeśli chcesz dynamicznie rzutować obiekt w czasie wykonywania, nie będziesz mógł użyć var
ani żadnego innego specyfikatora typu betonu.
opcje są ograniczone do jednego z dwóch możliwych zgłoszeń:
podstawie tego, co myślę chcesz zrobić z unboxedData
Podejrzewam dynamic
jest trasa, którą chcesz iść, ponieważ pozwoliłaby ci wywołać dowolną metodę na celu Type
.
Oto, co wymyśliłem.
public void FooBar(object value, Type expected)
{
dynamic unboxedData = expected.FromObject(value);
unboxedData.CallSomeMethodDefinedInTheTargetType(); // This will work.
}
Wymagana jest następująca metoda przedłużenia.
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();
}
}
Gips będzie działał, jeśli spełniony jest jeden z poniższych warunków.
- Wartość do przekonwertowania implementuje
IConvertible
i zawiera ścieżkę konwersji do typu celu.
- Wartość do przekonwertowania podklas typ docelowy.
- Wartość do przekonwertowania określa explicit conversion operator w deklaracji klasy.
Chcesz * przetestować * lub chcesz * rzucić *? – CesarGon