好的,我有一个名为 Product 的抽象类。我有 3 个表,分别称为 Items、Kits 和 Packages,它们实现了 Product。产品具有公开对象主键的公共属性。
也就是说,我有一个传递产品的表格。我想将该产品从新的数据上下文中取出,而不必编写一个反映其类型的大开关来获取其正确的表。
我想做这样的事情,但强制转换位不接受 foo.
public BuilderInclusionsForm(Product p) : this()
{
Type foo = p.GetType();
product = db2.GetTable(p.GetType()).Cast<foo>().SingleOrDefault(a =>
a.ProductID == p.ProductID);
or this:
public BuilderInclusionsForm(Product p) : this()
{
Type foo = p.GetType();
product = db2.GetTable(p.GetType()).OfType<foo>().SingleOrDefault(a =>
a.ProductID == p.ProductID);
不可以,因为必须在编译时知道类型参数才能出现在源代码中。
您可以使 BuilderInclusionsForm 在产品类型中通用,或者编写如下通用方法:
private static T FindProduct<T>(T product) where T : Product
{
return db2.GetTable(typeof(T))
.OfType<T>()
.SingleOrDefault(a => a.ProductID == p.ProductID);
}
然后通过反射调用它:
public BuilderInclusionsForm(Product p) : this()
{
MethodInfo method = typeof(BuilderInclusionsForm).GetMethod("FindProduct",
BindingFlags.Static | BindingFlags.NonPublic);
MethodInfo concrete = method.MakeGenericMethod(new Type[] { p.GetType() });
product = (Product) concrete.Invoke(null, new object[] { p });
}
(显然,您可以缓存该方法的打开形式。)
不太好,但应该可以。我怀疑将 BuilderInclusionsForm 设为通用会更好 - 你总是可以有一个辅助类:
public static class BuilderInclusionsForm
{
public static BuilderInclusionsForm<T> Create<T>(T product) where T : Product
{
return new BuilderInclusionsForm<T>(product);
}
}
这将允许您使用类型推断。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)