将公共属性约束为List中的特定类型

本文关键字:类型 Type 属性 约束 List | 更新日期: 2023-09-27 17:50:23

我最初的问题基本上与将类型约束到特定类型相同。

我希望完成的基本上是这个。

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"。不能使用类型'作为泛型中的类型参数'T'类型或方法"CustomSerializableTypeList"。在那里没有隐式引用转换吗从"系统。类型"ITcpSerializable"。

一旦我看到并考虑到建议的泛型实现,这个错误就完全有意义了。

一定有办法的

将公共属性约束为List<Type>中的特定类型

我认为您将需要自己的列表实现来包装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

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

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

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

没有快速简便的方法来做到这一点。你必须实现你自己的集合类,重写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);
    }
}