有一个很有趣的情况,似乎无法找到任何对周围的反射,继承和泛型腹板混凝土。使用实体框架抽象类
要开始使用:
我有一个抽象基类化,可称为:
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