【发布时间】:2021-11-28 18:06:51
【问题描述】:
我有以下班级布局:
abstract class GenericClass<TArgs> where TArgs : ArgsBaseClass { }
abstract class ArgsBaseClass { }
class RandomArgs : ArgsBaseClass { }
class RandomClass : GenericClass<RandomArgs> { }
现在我希望能够从RandomArgs 的实例创建RandomClass 的实例,而不知道它应该是RandomClass。 IE。不知何故,我需要推导出 RandomClass 实现 GenericClass<RandomArgs> 的事实。
我可以使用以下方法创建GenericClass<RandomArgs> 的实例:
void CreateSpecificInstance(ArgsBaseClass args)
{
Type genericType = typeof(GenericClass<>).MakeGenericType(typeof(args));
var genericInstance = Activator.CreateInstance(genericType, typeof(args));
// But then I need help for the following step:
Type specificType = ... // in this case RandomClass, but should be derived from 'args'.
var specificInstance = (specificType)genericInstance;
}
感谢任何帮助。
编辑:
基本上我有多个args 类。每个args 类都有一个相应的“正常”类,可以用这个args 类进行初始化。因此GenericClass<ArgsBaseClass>。
现在我希望能够在将ArgsBaseClass 的实例传递给某个函数时创建“普通”类的实例(在我的示例中名为CreateSpecificInstance。
根据我的 cmets,我想可以在每个 args 类和“普通”类之间创建一个映射,例如使用字典,但每当您添加新的 args + 'normal' 类组合时,您还需要更新此字典。因此我猜这里应该使用使用反射的解决方案,但是我没有看到使用反射的解决方案不会迭代程序集或命名空间中的所有类,因此我正在寻求帮助。
【问题讨论】:
-
你应该解释为什么你需要这个。
-
您必须在所有加载的程序集中搜索这种类型。如果有多种这样的类型,你会怎么做?
-
在编译时还不清楚您知道哪些类型。你知道
args的确切类型吗,你能把TArgs args) where TArgs : ArgsBaseClass设为通用吗? -
请查看 xyproblem.info。正如@aybe 评论的那样,请解释您想要实现的目标,而不是仅仅询问您正在尝试的问题。
-
伙计们,这个要求是有道理的。我怀疑如果他问他需要一种“注册通用实现类的动态方式”,那么这个问题就会过于宽泛。
标签: c# generics reflection