C# 将类型馈送到构造函数中 类程序{ void Apple(){ 列表苹果=新列表{(新香蕉(黄瓜,5)),(新香蕉(日期,6))}; } } 香蕉班{ 公共香蕉(茄子型,int feijoa){ 新茄子; } } 黄瓜类{ 公共黄瓜(int feijoa){ } } 上课日期{ 公开日期(国际会议){ } }

C# 将类型馈送到构造函数中 类程序{ void Apple(){ 列表苹果=新列表{(新香蕉(黄瓜,5)),(新香蕉(日期,6))}; } } 香蕉班{ 公共香蕉(茄子型,int feijoa){ 新茄子; } } 黄瓜类{ 公共黄瓜(int feijoa){ } } 上课日期{ 公开日期(国际会议){ } },c#,types,constructor,C#,Types,Constructor,基本上,它将一组信息从程序类馈送到香蕉类,然后香蕉类过滤这些信息并使用它创建一组不同类的实例 问题是在Program类中,尽管它注册了一个类型来完成香蕉构造函数,但当给定一个类型(如Cucumber或Dates)时,它表示在给定的上下文中给定一个类型被认为是无效的,因此我希望得到一些帮助,了解如何修复它,提前谢谢 虽然以这种方式构造我的程序可能看起来奇怪且效率低下,但它主要是为了帮助简化对程序前端的查看和编辑。在将参数传递给构造函数时,应该使用typeof运算符 比如: class Progra

基本上,它将一组信息从程序类馈送到香蕉类,然后香蕉类过滤这些信息并使用它创建一组不同类的实例

问题是在Program类中,尽管它注册了一个类型来完成香蕉构造函数,但当给定一个类型(如Cucumber或Dates)时,它表示在给定的上下文中给定一个类型被认为是无效的,因此我希望得到一些帮助,了解如何修复它,提前谢谢


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

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

比如:

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){
  }
}
因此,您的代码片段将更改为:

class Banana<T> where T: new(){
  public Banana(int feijoa){
    Activator.CreateInstance(typeof(T), new object[]{feijoa}  
  } 
List苹果=新列表{(新香蕉(5)),(新香蕉(6))};

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

比如:

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){
  }
}
因此,您的代码片段将更改为:

class Banana<T> where T: new(){
  public Banana(int feijoa){
    Activator.CreateInstance(typeof(T), new object[]{feijoa}  
  } 
List苹果=新列表{(新香蕉(5)),(新香蕉(6))};

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

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

下面是有关代码的更多上下文。
Banana
类型的构造函数实际上不正确

无法对类型实例调用
new
。您实际要做的是实例化传递的
egggplant
参数的对象。有多种方法可以实现这一点。但在详细讨论之前,我建议您首先了解类型构造函数

此外,你的意图有点不清楚。您试图对新创建的实例执行的操作。我现在假设您将在某个成员变量中存储该实例,如下所示:

new Banana(typeof(Cucumber), 5)
new Banana(typeof(Dates), 6)
这里我使用了
Activator
类型,它将创建给定类型的实例,前提是它将根据您传递的参数找到匹配的构造函数。否则,将引发异常

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

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

public class Banana
{
    private readonly object instance;

    public Banana(Type eggplant, int feijoa)
    {
        this.instance = Activator.CreateInstancenew eggplant(feijoa, new object [] {feijoa});
    }
}
类程序
{
无效苹果()
{
列表苹果=新列表{新香蕉(新黄瓜(5)),新香蕉(新日期({Feijoa=6})};
}
}
香蕉班
{
私有只读ICommon实例;
公共香蕉(ICommon实例)
{
this.instance=instance;
}
}
公共接口ICommon
{
int Feijoa{get;set;}
}
班级:ICommon
{
公共黄瓜(int feijoa)
{
这个。Feijoa=Feijoa;
}
公共int Feijoa{get;set;}
}
上课日期:ICommon
{
公开日期()
{
}
公共int Feijoa{get;set;}
}
很抱歉,提供的上下文不够具体。与此同时,我尽可能多地分享。我知道,它可能看起来有点分散


希望这有帮助。

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

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

下面是有关代码的更多上下文。
Banana
类型的构造函数实际上不正确

无法对类型实例调用
new
。您实际要做的是实例化传递的
egggplant
参数的对象。有多种方法可以实现这一点。但在详细讨论之前,我建议您首先了解类型构造函数

此外,你的意图有点不清楚。您试图对新创建的实例执行的操作。我现在假设您将在某个成员变量中存储该实例,如下所示:

new Banana(typeof(Cucumber), 5)
new Banana(typeof(Dates), 6)
这里我使用了
Activator
类型,它将创建给定类型的实例,前提是它将根据您传递的参数找到匹配的构造函数。否则,将引发异常

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

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