2010-05-01 106 views
3

简单地说,我的问题是关于在运行时定义实例的类型,而这种类型是用户定义的。 的东西,看起来像这样:如何在C#中声明其类型为用户定义的实例

Type instance1; 

在运行时,用户要选择如“int”,则“会是

int instance1; 

任何建议?在这里downCasting有效吗?

+1

哇,它以某种方式闻到可怕的错误。你正在编写一个应用程序,其中的用户必须知道它的代码并告诉它使用什么类型?如果我可能会问,你想做什么? – 2010-05-01 15:44:44

+0

有关您愿意实施的更多信息将非常有用。用户定义类型来自哪里?终端用户是否选择了它,可以说,GUI中的下拉框? – 2010-05-01 15:46:09

+0

@Maciej:正好。这就是我提出泛型的原因。由于c#是一种静态类型的语言,因此您也应该这样编写代码。 'dynamic'关键字可能不是解决严格类型语言问题的正确方法(人们在c#4和'dynamic' :)之前编写了很棒的程序)。也许Shaza必须使用反射器,如果这个类型真的是_end_user定义的,但他没有说具体的东西。 – 2010-05-01 15:49:39

回答

2

你在找什么是泛型。阅读简介here

例如你声明类,希望该用户定义类型是,这样的:

class MyClass<T> 
{ 
    private T instance1 = default(T); 

    public MyClass(T initalvalue) 
    { 
     instance1 = initalvalue; 
    } 

    //... some more code 
} 
+0

恐怕,泛型不是OP所要寻找的。 Shaza正在谈论最终用户使用正在运行的应用程序,而不是使用他的代码的程序员。该类型应该在运行时选择 – 2010-05-01 15:39:56

+0

@Maciej:这只是猜测,只要Shaza没有说出他真正想做的事情。 – 2010-05-01 15:55:55

+0

我评论了我正在工作的基本职位,顺便说一声,我是“她”:) – Lisa 2010-05-01 16:47:54

1

没有你解释,你希望完成什么更多的细节,你可以使用一个generic方法*,您可以使用C# 4's dynamic keyword,或者您可以使用reflection来创建给定类型的实例。

*通用方法,将工作做好,如果该类型可以在编译时是已知的,或者如果它只是一个有限集合类型中的一种,你会选择一个这是在编译时命名的类型(即用户将会说int,chardouble之一,并且您将相应地使用正确的通用)。如果它是完全不确定的,那么您仍然需要使用反射来实例化运行时给出的类型的泛型。

+0

+1。是的,如果像你说的那样,在编译时已经有一组已知的类型,我想用泛型来解决它。如果你不使用动态语言,我并不喜欢使用'dynamic'。我认为把c#变成它不是一个动态语言是相当丑陋的。 – 2010-05-01 15:54:02

0

动态关键字在C#4.0

0

我想,这是你在找什么:

Type myType = typeof(int); 
int value = Activatior.CreateInstance(myType); 

在.NET 4中,动态关键字也许是更有效,更方便。