好的,所以我有一个名为Product的抽象类.我有3个名为Items,Kits和Packages的表,它们实现了Product.产品具有公开属性,公开对象的主键.
那说我有一个表格,我通过产品.我想从新的datacontext中取出该产品,而不必编写一个反映它的类型的大开关来获得正确的表格.
我想做这样的事情,但演员阵容不会接受foo.
public BuilderInclusionsForm(Product p) : this() { Type foo = p.GetType(); product = db2.GetTable(p.GetType()).Cast().SingleOrDefault(a => a.ProductID == p.ProductID);
或这个:
public BuilderInclusionsForm(Product p) : this() { Type foo = p.GetType(); product = db2.GetTable(p.GetType()).OfType().SingleOrDefault(a => a.ProductID == p.ProductID);
Jon Skeet.. 5
不,因为必须在编译时知道类型参数才能出现在源代码中.
您可以在产品类型中创建BuilderInclusionsForm泛型,也可以编写如下通用方法:
private static T FindProduct(T product) where T : Product { return db2.GetTable(typeof(T)) .OfType () .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 BuilderInclusionsFormCreate (T product) where T : Product { return new BuilderInclusionsForm (product); } }
这将允许您使用类型推断.
不,因为必须在编译时知道类型参数才能出现在源代码中.
您可以在产品类型中创建BuilderInclusionsForm泛型,也可以编写如下通用方法:
private static T FindProduct(T product) where T : Product { return db2.GetTable(typeof(T)) .OfType () .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 BuilderInclusionsFormCreate (T product) where T : Product { return new BuilderInclusionsForm (product); } }
这将允许您使用类型推断.