有一個很有趣的情況,似乎無法找到任何對周圍的反射,繼承和泛型腹板混凝土。使用實體框架抽象類
要開始使用:
我有一個抽象基類化,可稱爲:
public abstract class ItemBase
{
// default properties
}
ItemBase就變成了我的超類的抽象實體,稱爲項目:
public abstract class Item
{
// some extra properties
}
這背後的想法是構造將繼承Item的附加屬性集的實體:
public partial class City : Item {}
現在,在測試方法我想使用反射來調用通過實體的方法,並返回任何數據,在什麼都形成,從方法回來。
假設,出於測試目的,我們在狀態的方法,返回所有主要城市的集合:
public List<City> GetAllMajorCities() {}
在我的存根我可能有一個測試,以獲得所有城市:
List<Item> cities = this.InvokeGenericMethod<Item>("State", "GetAllMajorCities", args);
然後InvokeGenericMethod(字符串,字符串,對象[]參數)看起來像:
public IEnumerable<T> InvokeGenericMethod<Item>(string className, string methodName, object[] args)
{
Type classType = className.GetType(); // to get the class to create an instance of
object classObj = Activator.CreateInstance(classType);
object ret = classType.InvokeMember(methodName, BindingFlags.InvokeMethod, null, classObj, args);
}
從理論上講,從給出的實例中,「RET」的值應該是一個IEnumerable類型,然而,返回類型,如果加入到手錶investivage,返回列表,如果我檢查RET值:
if (ret is IEnumerable<T>)
它忽略了檢查。
如果我改變
public List<City> GetAllMajorCities() {}
到
public List<ItemBase> GetAllMajorCities() {}
似乎要堅持繼承和允許我丟給IEnumberable。
我在這裏完全難住了。
任何意見,建議,將不勝感激。
感謝,
埃裏克
你能重新檢查你的代碼嗎?我覺得有一些東西混在一起。我猜你的InvokeGenericMethod不起作用。例如,className.GetType()將全部返回類型字符串。 – Achim 2011-04-20 07:23:01
嗨Achim,上面的代碼是一個真正的道歉,如果它有點混亂的例子。在綁定一個下拉列表時,我使用反射到類的全名,類的字符串格式的命名空間,然後將其作爲一個字符串傳遞給我的InvokeGenericMethod。 – JadedEric 2011-04-20 10:09:10