C# 定义将在构造函数中使用的类型
我想将类型为C# 定义将在构造函数中使用的类型,c#,generics,constructor,C#,Generics,Constructor,我想将类型为AbstractObject的对象与我的当前类相关联 但是,这必须在构造函数中完成,因为当我定义类时,我不知道将关联哪种类型的对象(只知道这是类型AbstractObject)。我需要在类中构造关联的对象(因此我不能将实例作为参数) 所以它会是这样的: public abstract class MyClass { public MyClass(Type T) where T : AbstractObject { (T)Actiocator.Creat
AbstractObject
的对象与我的当前类相关联
但是,这必须在构造函数中完成,因为当我定义类时,我不知道将关联哪种类型的对象(只知道这是类型AbstractObject
)。我需要在类中构造关联的对象(因此我不能将实例作为参数)
所以它会是这样的:
public abstract class MyClass
{
public MyClass(Type T) where T : AbstractObject
{
(T)Actiocator.CreateInstance(Typeof(T));
//To do
}
}
但这不起作用。知道如何解决这个问题吗?试试这个:
public abstract class MyClass<T> where T : AbstractObject, new()
{
public MyClass(T type)
{
T instance = new T();
}
}
公共抽象类MyClass,其中T:AbstractObject,new()
{
公共MyClass(T型)
{
T实例=新的T();
}
}
如果在泛型约束中添加new()
,则可以调用类的无参数构造函数
创建一个接口或一个抽象类,让他们在要传递给当前类构造函数的类中实现它
public interface ITest
{
// your interface method and properties
}
public class Child : ITest
{
// do your stuff here
}
public abstract class MyClass
{
public MyClass(ITest tes)
{
// do stuff using test
}
}
也许这样的东西适合你
abstract class AbstractObject {}
class Test : AbstractObject
{
public Test()
{
Console.WriteLine("I work");
}
}
class GenTest<T> where T: AbstractObject, new()
{
T obj;
public GenTest()
{
obj = new T();
}
}
public static void Main()
{
var genTestObj = new GenTest<Test>();
}
抽象类抽象对象{}
类测试:抽象对象
{
公开考试()
{
Console.WriteLine(“我工作”);
}
}
类GenTest,其中T:AbstractObject,new()
{
T-obj;
公共绅士
{
obj=新的T();
}
}
公共静态void Main()
{
var genTestObj=new GenTest();
}
根据您的用例,有几个选项
传入对象
最简单的方法是让调用者构造对象,并通过构造函数传入:
public MyClass(AbstractObject template)
{
// Do something with template
}
private MyClass(AbstractObject template)
{
// Do something with template
}
public MyClass Create<T>() where T : AbstractObject, new()
{
// Create a temporary object just for passing into the private ctor
return new MyClass(new T());
}
提供静态工厂方法
扩展上述思想,如果您想控制构造函数使用的对象,可以提供一个静态方法,创建Base
对象并将其传递给构造函数:
public MyClass(AbstractObject template)
{
// Do something with template
}
private MyClass(AbstractObject template)
{
// Do something with template
}
public MyClass Create<T>() where T : AbstractObject, new()
{
// Create a temporary object just for passing into the private ctor
return new MyClass(new T());
}
还要注意,我添加了new()
约束,因此我可以简单地编写newt
。如果您知道T
将成为AbstractObject
的派生类,这是一种引用类型,那么这是很好的。如果希望能够从值类型(如int
)构造MyClass
es,可以删除new()
约束并使用反射
使类成为泛型
如果还需要在类中存储对象,请将整个类设置为泛型:
public class MyClass<T> where T : AbstractObject, new()
{
private T myObject;
public MyClass()
{
this.myObject = new T();
// Do other stuff
}
}
公共类MyClass,其中T:AbstractObject,new()
{
私有T对象;
公共MyClass()
{
this.myObject=new T();
//做其他事情
}
}
您为什么需要它?你想要达到的目标是什么?在构造函数中使用反射可能会导致问题。您不能在类上定义类型参数吗<代码>类MyClass,其中T:AbstractObject注意:这样做的缺点是您实际上必须传入一个T
,它可能是一个临时对象,其唯一目的是推断T
:例如MyClass mc=new MyClass(new ConcreteObject())代码>C#不允许对非泛型进行约束declarations@nozzleman尝试执行此操作时在visual studio中描述的错误