仅接受声明某些界面的类型

时间:2015-10-04 13:01:01

标签: c# oop types interface

如何做这样的事情

{{1}}

不首先构造对象或稍后检查类型?

2 个答案:

答案 0 :(得分:3)

C#中不直接支持您想要的内容。因为Constraints on Type参数只能在构造函数,继承层次结构,接口实现和其他一些参数上加以说明。 more details

你可以用不同的方式做到这一点,但是在这种方法中没有编译时错误:

公共接口IMyConstraint     {         void Do();     }

public class MyClass: IMyConstraint
{
    public void Do()
    {
    }
}

// Inherit from the List class to add some functionality to it
public class MyTypeList<T> : List<T> where T : System.Type
{
    public MyTypeList()
    {

    }

    // use new keyword to prevent client from using the List.Add method.
    public new void Add(T type)
    {
        // here you check if the type is implementing the interface or not
        if (!typeof(IMyConstraint).IsAssignableFrom(type))
        {
            // if it dose not implement the interface just throw an exception
            throw new InvalidOperationException();
        }
        // call the original List.Add method            
        base.Add(type);
    }
}

答案 1 :(得分:2)

如果你知道静态涉及的类型,你可以这样做:

public class TypeList<T>
{
    private readonly List<Type> types = new List<Type>();
    public void Add<D>() where D : T, new()
    {
        this.types.Add(typeof(D));
    }

    public T NewAt(int index)
    {
        return (T)Activator.CreateInstance(this.types[index]);
    }
}

然后你可以这样做:

var a = new TypeList<IMyInterface>;
a.Add<MyClass1>();
a.Add<MyClass2>();
a.Add<MyClass3>();
IMyInterface c = a.NewAt(1);
a.Add<object>(); //won't compile