gpt4 book ai didi

c# - 使用抽象类型的反射从表中获取实体

转载 作者:行者123 更新时间:2023-11-30 14:05:17 25 4
gpt4 key购买 nike

好的,所以我有一个名为 Product 的抽象类。我有 3 个名为 Items、Kits 和 Packages 的表来实现产品。 Product 具有公开对象主键的公共(public)属性。

也就是说,我有一个表格可以用来传递产品。我想将该产品从新的数据上下文中提取出来,而不必编写反射(reflect)其类型的大开关来获取其正确的表。

我想做这样的事情,但 cast bit 不接受 foo。

public BuilderInclusionsForm(Product p) : this()
{
Type foo = p.GetType();
product = db2.GetTable(p.GetType()).Cast<foo>().SingleOrDefault(a =>
a.ProductID == p.ProductID);

或者这个:

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);
}
}

这将允许您使用类型推断。

关于c# - 使用抽象类型的反射从表中获取实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/439086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com