我原来的问题与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'。
一旦我查看并考虑已建议的泛型实现,该错误就非常有意义。
必须有办法解决这个问题。
答案 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);
}
}