定义将在构造函数中使用的类型

时间:2016-08-01 10:31:10

标签: c# generics constructor

我想将AbstractObject类型的对象与我当前的类相关联。

但是,这必须在构造函数中完成,因为当我定义我的类时,我不知道哪个类型的对象将被关联(只有它是类型AbstractObject)。我需要在我的类中构造关联对象(所以我不能将实例作为参数)。

所以它会是这样的:

public abstract class MyClass
{
    public MyClass(Type T) where T : AbstractObject
    {
        (T)Actiocator.CreateInstance(Typeof(T));
        //To do 
    }
}

但这不起作用。知道如何解决这个问题吗?

4 个答案:

答案 0 :(得分:3)

根据您的使用情况,有几种选择。

传入对象

最简单的方法是让调用者构造对象,并通过构造函数传递它:

public MyClass(AbstractObject template) 
{
    // Do something with template
}

提供静态工厂方法

扩展上面的想法,如果你想控制构造函数使用的对象,你可以提供一个静态方法来创建一个Base对象并将其传递给构造函数:

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());
}

我将构造函数设为私有,因此您只能通过静态实例创建新的MyClass对象:

MyClass.Create<Concrete>();

另请注意,我添加了new()约束,因此我只需编写new T即可。如果您知道T将成为AbstractObject的派生类(参考类型),那么这很好。如果您希望能够从MyClass等值类型构建int es,则可以删除new()约束并使用反射。

使类通用

如果您还需要将对象存储在类中,请将整个类设为通用:

public class MyClass<T> where T : AbstractObject, new()
{
    private T myObject;
    public MyClass()
    {
        this.myObject = new T();
        // Do other stuff   
    }
}

答案 1 :(得分:0)

创建一个接口或抽象类,它们在要传递给当前类构造函数的类中实现它

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
    }
}

答案 2 :(得分:0)

也许这样的事情适合你?

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>();
}

答案 3 :(得分:-1)

试试这个:

public abstract class MyClass<T> where T : AbstractObject, new()
{
    public MyClass(T type)
    {
        T instance = new T();
    }
}

如果在泛型约束中添加new(),则可以调用类的无参数构造函数。

https://msdn.microsoft.com/en-us/library/bb384067.aspx