将实体框架与抽象类一起使用

| 有一个非常有趣的情况,并且似乎无法在网络上找到任何有关反射,继承和泛型的具体内容。 首先开始: 我有一个基本的抽象分类,名为:
public abstract class ItemBase
{
     // default properties
}
然后,ItemBase成为我的超抽象类,称为Item:
public abstract class Item
{
    // some extra properties
}
其背后的想法是构造将从Item继承并设置其他属性的实体:
public partial class City : Item {}
现在,在测试方法中,我试图使用反射在传递的实体上调用方法,并从该方法返回以任何形式返回的任何数据。 假设出于测试目的,我们在State中有一个方法,该方法返回所有主要城市的集合:
public List<City> GetAllMajorCities() {}
在我的存根中,我可能会进行一次测试以获取所有城市:
List<Item> cities = this.InvokeGenericMethod<Item>(\"State\", \"GetAllMajorCities\", args);
然后,InvokeGenericMethod(string,string,object [] args)类似于:
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的类型,但是,如果我将ret值检查为以下形式,则返回类型(如果添加到调查中的手表)将返回List:
if (ret is IEnumerable<T>)
它忽略了检查。 如果我改变
public List<City> GetAllMajorCities() {}
public List<ItemBase> GetAllMajorCities() {}
它似乎坚持继承并允许我将其强制转换为IEnumberable。 我完全被困在这里。 任何想法,建议将不胜感激。 谢谢, 埃里克
已邀请:
您是否正在使用Framework 3.5? .net 4.0中引入了通用协和逆。因此,在Framework 3.5中无法进行以下操作:
class ItemBase { }
class Item : ItemBase { }
class City : Item { }

class Program
{
    static void Main(string[] args)
    {
        IEnumerable<City> cities = new List<City>();
        IEnumerable<Item> items = cities;  // Compile error here. IEnumerable<Item> is not a supertype of IEnumerable<City>.
    }
}
请注意,以下(这是您要实现的目标)甚至无法在.net 4.0中使用:
List<Item> cities = new List<City>();
为什么这样不起作用?因为必须可以在
List<Item>
上加上任意的
Item
。但是,显然,
cities.Add(new Person());
不起作用(因为nce14ѭ的\“ real \”(=静态)类型为
List<City>
)。因此,
List<Item>
永远不可能是be15ѭ的超型。 您不能将项目添加到IEnumerable中,这就是为什么
IEnumerable<City>
IEnumerable<Item>
之间存在子类型关系的原因(但如上所述,仅在.net 4.0中如此)。
您可以尝试这样的事情:
        Type type = ret.GetType();
        Type listType = typeof(IEnumerable<T>);
        if (type == listType || type.IsSubclassOf(listType))
        {
            //
        }
首先,这是错误的:
Type classType = className.GetType();
该构造将产生类型为
String
的类型
className
,而不是名称存储在
className
中的类型。 更好,更类型安全的方式是:
public IEnumerable<TItem> InvokeGenericMethod<TItem, TContainer>(...)
    where TItem : ItemBase
    where TContainer : class, new()
{
    TContainer container = new TContainer();
    ...
}
更新:如果
TContainer
类型在调用static27 known的地方不是静态已知的,请查看静态
Type.GetType
方法以从其字符串名称解析实际名称。在最简单的情况下,“ 29”方法将访问您类型的程序集限定名称,例如30英镑

要回复问题请先登录注册