C# 在运行时使用泛型创建对象

发布于 2024-07-22 18:14:33 字数 480 浏览 7 评论 0原文

在下面的示例中,我可以通过字符串动态创建一个对象; 但是,我无法获取 BASE 类的公共方法。 我无法将 obj 转换为 BASE,因为我不知道在设计时将使用什么泛型。 任何关于在运行时这样做的建议都会很好。

项目A包含类A{T,J> : BASE{T,J>
项目 B 包含 B{T,J> 类 : BASE{T,J>

项目 C 包含类 BASE{T,J>
公共虚拟控制{T,J> item

项目 Windows 窗体
cmdGo_Click 事件

字符串 dll = textbox1.text //ex "ProjectA.dll"
string class = textbox2.text //ex "A`2[enuT,enuJ]"
对象 obj = activator.createinstancefrom(dll,类)

In the following example i can create an object dynamically via a string; however, i have no way to get at the public methods of BASE class. i can't cast obj to a BASE because i don't know what generic will be used at design time. any suggestings on doing so at runtime would be nice.

Project A contains Class A{T,J> : BASE{T,J>
Project B contains Class B{T,J> : BASE{T,J>

Project C contains Class BASE{T,J>
public virtual control{T,J> item

Project Windows Form
cmdGo_Click event

string dll = textbox1.text //ex "ProjectA.dll"
string class = textbox2.text //ex "A`2[enuT,enuJ]"
object obj = activator.createinstancefrom(dll,class)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

硬不硬你别怂 2024-07-29 18:14:33

此代码创建 BASE的实例 :

Type type = typeof(BASE<,>).MakeGenericType(typeof(int), typeof(string));
object instance = Activator.CreateInstance(type);

This code creates an instance of BASE<int, string> :

Type type = typeof(BASE<,>).MakeGenericType(typeof(int), typeof(string));
object instance = Activator.CreateInstance(type);
静水深流 2024-07-29 18:14:33

如果您不知道运行时使用的类型参数,那么您也无法使用依赖于这些类型的任何操作,所以...为什么不为 BASE 创建一个非泛型基类包含所有不依赖于泛型参数的操作,那么您可以将 obj 命名为该基本类型并使用它。

If you do not know the type parameters used at run-time, then you cannot use any operations that depend on these types either, so... why not make a non-generic base class to BASE that contains all the operations that do not depend on the generic parameters, then you can case obj to that base type and use it.

归途 2024-07-29 18:14:33

运行时等式的泛型部分并不重要,因为编译器已经填补了泛型实现的空白。 我相信您可以使用反射来获取基类方法,就像下面的示例一样,我希望这会有所帮助。

MethodInfo[] baseMethods = obj.GetType().BaseType.GetMethods();
object retObj = baseMethods[0].Invoke(obj, new object[] {"paramVal1", 3, "paramVal3"});

At runtime the generics part of the equation does not matter, because the compiler has already filled in the gaps for the generic implementation. I believe you can use reflection to get at the base class methods, like in this example below, I hope this helps.

MethodInfo[] baseMethods = obj.GetType().BaseType.GetMethods();
object retObj = baseMethods[0].Invoke(obj, new object[] {"paramVal1", 3, "paramVal3"});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文