简单地说,我的问题是关于在运行时定义实例的类型,而这种类型是用户定义的。 的东西,看起来像这样:如何在C#中声明其类型为用户定义的实例
Type instance1;
在运行时,用户要选择如“int”,则“会是
int instance1;
任何建议?在这里downCasting有效吗?
简单地说,我的问题是关于在运行时定义实例的类型,而这种类型是用户定义的。 的东西,看起来像这样:如何在C#中声明其类型为用户定义的实例
Type instance1;
在运行时,用户要选择如“int”,则“会是
int instance1;
任何建议?在这里downCasting有效吗?
你在找什么是泛型。阅读简介here。
例如你声明类,希望该用户定义类型是,这样的:
class MyClass<T>
{
private T instance1 = default(T);
public MyClass(T initalvalue)
{
instance1 = initalvalue;
}
//... some more code
}
恐怕,泛型不是OP所要寻找的。 Shaza正在谈论最终用户使用正在运行的应用程序,而不是使用他的代码的程序员。该类型应该在运行时选择 – 2010-05-01 15:39:56
@Maciej:这只是猜测,只要Shaza没有说出他真正想做的事情。 – 2010-05-01 15:55:55
我评论了我正在工作的基本职位,顺便说一声,我是“她”:) – Lisa 2010-05-01 16:47:54
没有你解释,你希望完成什么更多的细节,你可以使用一个generic方法*,您可以使用C# 4's dynamic
keyword,或者您可以使用reflection来创建给定类型的实例。
*通用方法,将工作做好,如果该类型可以在编译时是已知的,或者如果它只是一个有限集合类型中的一种,你会选择一个这是在编译时命名的类型(即用户将会说int
,char
或double
之一,并且您将相应地使用正确的通用)。如果它是完全不确定的,那么您仍然需要使用反射来实例化运行时给出的类型的泛型。
+1。是的,如果像你说的那样,在编译时已经有一组已知的类型,我想用泛型来解决它。如果你不使用动态语言,我并不喜欢使用'dynamic'。我认为把c#变成它不是一个动态语言是相当丑陋的。 – 2010-05-01 15:54:02
动态关键字在C#4.0
我想,这是你在找什么:
Type myType = typeof(int);
int value = Activatior.CreateInstance(myType);
在.NET 4中,动态关键字也许是更有效,更方便。
哇,它以某种方式闻到可怕的错误。你正在编写一个应用程序,其中的用户必须知道它的代码并告诉它使用什么类型?如果我可能会问,你想做什么? – 2010-05-01 15:44:44
有关您愿意实施的更多信息将非常有用。用户定义类型来自哪里?终端用户是否选择了它,可以说,GUI中的下拉框? – 2010-05-01 15:46:09
@Maciej:正好。这就是我提出泛型的原因。由于c#是一种静态类型的语言,因此您也应该这样编写代码。 'dynamic'关键字可能不是解决严格类型语言问题的正确方法(人们在c#4和'dynamic' :)之前编写了很棒的程序)。也许Shaza必须使用反射器,如果这个类型真的是_end_user定义的,但他没有说具体的东西。 – 2010-05-01 15:49:39