将Type输入构造函数

时间:2018-03-10 04:53:54

标签: c# types constructor

class Program{ 
  void Apple(){ 
    List<Banana> apple = new List<Banana> { (new Banana(Cucumber, 5)), (new Banana(Dates, 6)) }; 
  } 
}

class Banana{
  public Banana(Type eggplant, int feijoa){     
    new eggplant(feijoa);  
  }
}

class Cucumber{
  public Cucumber(int feijoa){
  }
}

class Dates{
  public Dates(int feijoa){
  }
}

基本上它将来自程序类的大量信息提供给Banana类,Banana类然后过滤该信息并使用它来创建一堆不同类的实例。

问题出在Program类中,即使它注册了一个Type来完成Banana构造函数,当给出一个Type,比如Cucumber或Dates时,它表示给出一个类型,在给定的类中没有被认为是有效的上下文,所以我想要一些帮助,理解如何解决它,提前谢谢。

虽然以这种方式构建我的程序可能看起来很奇怪且效率低下,但它主要是为了帮助简化查看和编辑程序的前端。

2 个答案:

答案 0 :(得分:2)

在将参数传递给构造函数时,应使用typeof运算符。

喜欢:

List<Banana> apple = new List<Banana> { (new Banana(typeof(Cucumber), 5)), (new Banana(typeof(Dates), 6)) };

但是在构造函数中,您需要使用Activator.CreateInstance(typeof(T), object[] args)来实例化CucumberBanana个对象。

另外,您最好考虑重新设计您的课程:

class Banana<T> where T: new(){
  public Banana(int feijoa){
    Activator.CreateInstance(typeof(T), new object[]{feijoa}  
  } 

因此您的代码段将更改为:

List<Banana> apple = new List<Banana> { (new Banana<Cucumber>(5)), (new Banana<Dates>(6)) };

答案 1 :(得分:0)

要获取Cucumber类的Type实例,您应该使用typeof(Cucumber)。因此,您的构造函数应该更改为如下所示:

new Banana(typeof(Cucumber), 5)
new Banana(typeof(Dates), 6)

<强>更新

以下是有关您的代码的更多背景信息。 Banana类型的构造函数实际上是不正确的。

无法在类型实例上调用new。您实际要做的是实例化传递的eggplant参数的对象。有多种方法可以实现这一目标。但在进入细节之前,我建议您首先read关于类型构造函数。

此外,有点不清楚你的意图是什么。你正在尝试用新创建的实例做什么。我现在假设您将该实例存储在某个成员变量中,如下所示:

public class Banana
{
    private readonly object instance;

    public Banana(Type eggplant, int feijoa)
    {
        this.instance = Activator.CreateInstancenew eggplant(feijoa, new object [] {feijoa});
    }
}

我已经使用了Activator类型,如果它根据您传递的参数找到匹配的构造函数,它将创建给定类型的实例。否则,将抛出异常。

虽然上述方法可行,但它并不理想,因为它不提供类型安全性。所以在这里使用Generics会很棒,但是由于需要有一个接受参数的构造函数,所以当前的代码是不可能的。仍有一种方法可以实现这一点,但它需要进行大量代码更改,这与您的问题没有直接关系。您可以阅读有关Generics here的更多信息。

虽然还有很多其他选择,但我会问你是否真的需要拥有你在这里的设计。为什么不直接将实例传递给Banan类。为此,您需要确保有一个基类/接口,Banana构造函数的所有潜在参数都将扩展。以下是您可以使用的示例:

class Program
{
    void Apple()
    {
        List<Banana> apple = new List<Banana> { new Banana(new Cucumber(5)), new Banana(new Dates() { Feijoa = 6 }) };
    }
}

class Banana
{
    private readonly ICommon instance;

    public Banana(ICommon instance)
    {
        this.instance = instance;
    }
}

public interface ICommon
{
    int Feijoa { get; set; }
}

class Cucumber : ICommon
{
    public Cucumber(int feijoa)
    {
        this.Feijoa = feijoa;
    }

    public int Feijoa { get; set; }
}

class Dates : ICommon
{
    public Dates()
    {
    }

    public int Feijoa { get; set; }
}

抱歉,提供的上下文不应该更具体。与此同时,我试图尽可能地分享。我知道,它可能看起来有些分散。

希望这有帮助。