将公共属性约束到List <type> </type>中的特定类型

时间:2011-04-18 15:06:10

标签: c# generics interface types

我原来的问题与Constrain type to specific types基本相同。

我想要完成的基本上就是这个。

public List<Type> MyPublicProperty { get; set; } where T IMyCustomInterface

现在阅读上述问题我可以看出它显然是不可能的。

为了让您了解上下文我正在构建一个旨在支持多种类型的解析器(假设它们实现了特定的接口),但我没有编译类型假设它可能解析的数据类型。它只是提供了一个受支持类型的列表,并且应该能够自动计算其余类型。

所以基本上我想知道的是这样一个属性(如果存在)的替代方法(除了设置属性时的运行时类型检查)?

编辑:建议的解决方案似乎不起作用。

我最终得到的代码如下:

public class CustomSerializableTypeList<T> : List<T> where T : ITcpSerializable
{

}

CustomSerializableTypeList<Type> myCustomTypes = new CustomSerializableTypeList<Type>();

并收到以下错误:

  

无法使用“System.Type”类型   作为通用中的类型参数'T'   类型或方法   'CustomSerializableTypeList'。那里   没有隐式引用转换   从'System.Type'到   'ITcpSerializable'。

一旦我查看并考虑已建议的泛型实现,该错误就非常有意义。

必须有办法解决这个问题。

3 个答案:

答案 0 :(得分:3)

我认为你需要自己的列表实现来包装List<Type>。也许是这样的:

public class TypeList<T> where T : class
{
    private readonly List<Type> list = new List<Type>();

    public void Add(Type item)
    {
        if(!typeof(T).IsAssignableFrom(item))
        {
            throw new InvalidOperationException();
        }

        list.Add(item);
    }
}

当然,您可能希望实施IList<Type>,然后只需将方法委托给list

答案 1 :(得分:1)

您可以定义从CustomList<T>派生的新集合类型List<T>并添加类型约束,然后在您的班级中使用它代替List<Type>

public class CustomList<T> : List<T> where T : ICustomInterface {
    ...
}

答案 2 :(得分:1)

  

请注意:我不打算   提供一个实例列表   实现特定类型。我是   希望提供类型列表   实现特定的接口。

没有快速'n'简单的方法来做到这一点。您必须实现自己的集合类,重写add方法,然后检查类型是否通过反射实现您的接口...

class myTypeCollection : List<System.Type>
{
    override void Add(Type t)
    {
        if (t.GetInterface(typeof(MyCustomInterface)) == null)
            throw new InvalidOperationException("Type does not implement MyCustomInterface");

        base.Add(t);
    }
}