你可以通过反思来做到这一点:
var sampleClassName = XB.StronglyTypedParent.GetType().FullName; var newClassInstance = Activator.CreateInstance(Type.GetType(sampleClassName));
但是当你到达这一点时,你需要问自己:
“这真的是正确的做法吗?”
像这样聪明的技巧使代码不易维护,对新开发人员来说更难理解
泛型通常在某些算法使用抽象而不需要知道实体的每个细节时使用,如果你具体描述每个级别你不需要使用泛型,只需编写四个类。
需要了解您的任务更详细的建议,但是如果您的任务即将遍历您的树或抽象操作,您的结构可能是这样的:
interface INode<TParentType, TChildType>: IRoot<TChildType>, ILeaf<TParentType> { } interface IRoot<TChildType> { List<TChildType> Children { get; } } interface ILeaf<TParentType> { TParentType Parent { get; } } class FirstLevel : IRoot<SecondLevel> { public List<SecondLevel> Children { get; set; } } class SecondLevel : INode<FirstLevel, ThirdLevel> { public List<ThirdLevel> Children { get; set; } public FirstLevel Parent { get; set; } } class ThirdLevel : INode<SecondLevel, FourthLevel> { public List<FourthLevel> Children { get; set; } public SecondLevel Parent { get; set; } } class FourthLevel : ILeaf<ThirdLevel> { public ThirdLevel Parent { get; set; } }
请描述您将对此结构执行哪些操作,如何加载,修改和处理?
C#不支持返回类型方差,因此这是一个非常常见的问题。我需要时解决它的方法是显式实现接口:
class XA : IA { //... } class XB : IB { private readonly XA parent; public XA Parent { get { return parent; } } IA IB.Parent { get { return Parent; } } //XA is implicitly convertible to IA so no ugly castings needed }
现在任何表达都喜欢 xB.Parent 将被打字 XA 而表达式喜欢 iB.Parent 将被打字 IA 。你可以获得两全其美的效果。
xB.Parent
XA
iB.Parent
IA