C#泛型问题

时间:2010-03-13 03:51:34

标签: c# generics

是否可以在c#中执行以下操作? 基本上TParent和TChildren应该是A类的类型,但是 not 必须具有相同的传入类型。我知道这可能听起来令人困惑但我想强烈地键入特定对象的子节点和父节点,但同时它们必须属于同一类型。因为TParent继承自A,这意味着它需要继承自A但使用可能不同类型的类型参数。

public class A<TParent, TChildren> 
    where TParent : A
    where TControls : A
{
    TParent Parent;
    List<TChildren> Children;
}

或更容易在这里看到:

public class A<TParent, TChildren>
    where TParent : A<?, ?>
    where TChildren : A<?, ?>
{
    TParent Parent;
    List<TChildren> Children;
}

我希望这不会太混乱。这有可能吗?

谢谢:)

3 个答案:

答案 0 :(得分:2)

如果您试图说“父母必须将此类型作为孩子而且孩子必须将此类型作为父母”,那么我认为答案是否定的,您不能,因为您还需要知道父母的父母和孩子的孩子的类型。

但是,你可以这样做

public interface IHasChildren<T>
{
    List<T> Children { get; set; }
}

public interface IHasParent<T>
{
    T Parent { get; set; }
}

public class A<TParent, TChildren> : IHasChildren<TChildren>, IHasParent<TParent>
    where TParent : IHasChildren<A<TParent, TChildren>>
    where TChildren : IHasParent<A<TParent, TChildren>>
{
    public List<TChildren> Children { get; set; }
    public TParent Parent { get; set; }
}

答案 1 :(得分:2)

不,这是不可能的。你最接近的是定义另一个基类型,并要求TParent和TChild继承:

public class A { }  // or an interface

public class A<TParent, TChild> : A
  where TParent : A
  where TChild : A
{ }

这并不能保证TParent和TChild属于通用A<,>类型,但至少允许您对它们设置一些约束,A<,>实现可以采用这些约束。

答案 2 :(得分:0)

不,这是不可能的。但是,一种解决方法是创建A<TParent, TChild>的子类,并强制泛型类型参数属于该类型:

public interface A
{
   // some properties and methods
}

public class A<TParent, TChild> : A where TParent : A where TChild A
{
   // something else here.  
}