C# 从某个抽象继承的类型参数

C# 从某个抽象继承的类型参数,c#,game-engine,C#,Game Engine,我想知道是否有一种方法可以传入强制为某个基类型的类型。例如,对于我的游戏引擎,我有一个属性列表(可控、刚体等)。我有一个addAttribute参数,它接受一个新对象。但是,我也希望有一个重载,它接受一个类型,而不是我可以自己创建一个新对象的类型。比如说 public void addAttribut(Type attribute) 我在想可能是实现linq的东西?我已经试过了,但看起来“where”只能用于泛型: public void addAttribute(Type attribute

我想知道是否有一种方法可以传入强制为某个基类型的类型。例如,对于我的游戏引擎,我有一个属性列表(可控、刚体等)。我有一个addAttribute参数,它接受一个新对象。但是,我也希望有一个重载,它接受一个类型,而不是我可以自己创建一个新对象的类型。比如说

public void addAttribut(Type attribute)
我在想可能是实现linq的东西?我已经试过了,但看起来“where”只能用于泛型:

public void addAttribute(Type attribute) where attribute : Attribute
将是函数的签名。我相信团结可以做到这一点;然而,它可以通过单声道来实现这一点

如果不是正确的基类型,我总是可以抛出异常。然而,我想知道是否有一种方法可以防止程序员一起错过错误的时间


有什么想法吗?非常感谢您的帮助

如果您乐于调用代码以在编译时了解类型,则可以使用类型参数使其成为泛型方法:

public void AddAttribute<T>() where T : Attribute
{
    // Use typeof(T)
}
public void AddAttribute(),其中T:Attribute
{
//使用类型(T)
}
或者强制执行无参数构造函数,然后可以调用该构造函数:

public void AddAttribute<T>() where T : Attribute, new()
{
    T t = new T();
    ...
}
public void AddAttribute(),其中T:Attribute,new()
{
T=新的T();
...
}

但是,否则就没有办法了,不行-您必须在执行时验证参数,就像其他任何参数一样。

Hah!完美现在我记得Unity是如何做到这一点的(很久没有使用它了!)对于任何想找到答案的人来说,这将把你的函数连接在一起,public void addAttribute(),其中t:Attribute,new(),因此你现在可以调用addAttribute(new t())@SergueiFedorov:不清楚您是否希望使用无参数构造函数创建实例;例如,您可能需要其他构造函数。我将编辑我的答案以澄清。