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