如何使用Type作为参数,但在编译时将其限制为基类

时间:2017-11-15 10:04:28

标签: c#

当用户更改问题的答案时,我希望他们根据一系列原因指定原因,并根据所选原因,我想创建一个特定的子类。所以我想保持在function connect() { if (!SOCKET) { var hash = getCookie('hash'); SOCKET = io('IP:3001'); SOCKET.on('connect', function(msg) { SOCKET.emit('hash', { hash: hash }); }); SOCKET.on('connect_error', function(msg) { $.notify('Connection lost!', 'success'); }); SOCKET.on('message', function(msg) { onMessage(msg); }); SOCKET.on('disconnect', function() { }); } else { console.log("Error: connection already exists."); } } 类中创建的类型。我可以这样做,检查在运行时是否正确指定了类型:

ChangeReason

有没有办法在编译时限制类型,也许使用泛型方法?我想这样称呼它:

public class ChangeReason
{
    Type _TypeToCreate;      

    public void SetQuestionType(Type value)
    {
        if (!value.IsSubclassOf(typeof(BaseAnsweredQuestion)))
            throw new InvalidOperationException("Invalid Type"); 

        _TypeToCreate = value;
    }
}

1 个答案:

答案 0 :(得分:3)

通用方法定义具有类型的占位符,例如<T>。这是类型参数或参数。 它是一种使方法类型安全的方法,并且可以从方法内部访问类型参数。因此,无需将类型作为方法参数传递。

通过添加约束,可以将泛型方法限制为指定的基类或该基类的派生类:where T : <base class name>

如果基类是抽象的,添加new()约束也会阻止使用基类型。

public void SetQuestionType<T>() where T: BaseAnsweredQuestion, new()
{
    _TypeToCreate = typeof(T);
}

然后你可以使用:

来调用它
reason.SetQuestionType<AnsweredQuestion>();

而不是:

reason.SetQuestionType(typeof(AnsweredQuestion));