類型的變量讓我們假設我有這些類使用類型類型爲
Animal
Cat : Animal
Dog : Animal
如果一個方法的地方,我有以下幾點:
Type animalType = someClass.Animal.GetType();
我怎麼能投someClass.Animal
成任何類型載在animalType
之內?喜歡的東西:
var animal = (animalType.Type)someClass.Animal;
類型的變量讓我們假設我有這些類使用類型類型爲
Animal
Cat : Animal
Dog : Animal
如果一個方法的地方,我有以下幾點:
Type animalType = someClass.Animal.GetType();
我怎麼能投someClass.Animal
成任何類型載在animalType
之內?喜歡的東西:
var animal = (animalType.Type)someClass.Animal;
你需要爲這個泛型方法:
public static class Converter
{
public static T ConvertTo<T>(this object source) where T :class
{
if (source is T)
{
return (T) source;
}
else
{
return null; // or throw exception
}
}
}
然後你可以使用反射來調用這個方法:
class Animal { }
class Cat : Animal { }
class Dog : Animal
{
public override string ToString()
{
return "I'm a dog!";
}
public bool IsDog { get { return true; } }
}
Animal a = new Dog();
var methodInfo = typeof (Converter)
.GetMethod("ConvertTo", BindingFlags.Static | BindingFlags.Public);
var method = methodInfo.MakeGenericMethod(a.GetType());
var dog = method.Invoke(null, new object[] { a });
Console.WriteLine(dog.ToString());
在這種情況下,它會寫I'm a dog
控制檯。但自從Invoke
方法返回一個對象,你不能訪問Dog
。爲了做到這一點的方法或屬性,你可以使用動態特點:
dynamic dog = method.Invoke(null, new object[] { a });
Console.WriteLine(dog.IsDog); // true
但隨後就失去了類型 - 安全。
因此,如果您不知道要在編譯時間上投下的類型,則無法直接使用類型實例執行此操作。
動態是我過去使用的......這正是我打開這個問題的原因,我在代碼中得到了一點,我知道那裏有什麼一個特定的屬性,但由於接口是通用的,我不能將對象轉換爲特定的泛型類型。 +1爲好解釋雖然:) – PedroC88
你真的想做什麼?不應該有任何需要這樣做,因爲你無法使用它的方法/屬性 – Sayse
我一直在想這個問題......我仍然認爲這可能是一個有趣的練習。 – PedroC88
這聽起來像你真的想要一個接口或只是更強大的繼承 – Sayse