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时,它表示给出一个类型,在给定的类中没有被认为是有效的上下文,所以我想要一些帮助,理解如何解决它,提前谢谢。
虽然以这种方式构建我的程序可能看起来很奇怪且效率低下,但它主要是为了帮助简化查看和编辑程序的前端。
答案 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)
来实例化Cucumber
或Banana
个对象。
另外,您最好考虑重新设计您的课程:
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; }
}
抱歉,提供的上下文不应该更具体。与此同时,我试图尽可能地分享。我知道,它可能看起来有些分散。
希望这有帮助。