如何在C#中声明一个用户定义类型的实例

3

我的问题是关于在运行时定义实例类型,而这个类型是用户自定义的。 类似下面这样的:

Type instance1;

在运行时,用户将选择例如“int”,然后会有以下内容:
int instance1;

有什么建议吗?在这里进行向下转型是否有效?

1
哇,它闻起来非常不对劲。您是在编写一个应用程序,其用户必须知道它的代码并告诉它要使用哪些类型吗?如果可以问一下,您想做什么? - Maciej Hehl
关于您想要实现的更多信息将非常有用。用户定义的类型来自哪里?最终用户是否可以从 GUI 中选择它,比如下拉框? - Philip Daubmeier
@Maciej:没错。这就是我提出泛型的原因。由于C#是一种静态类型语言,你应该以这种方式编写代码。在严格类型的语言中,“dynamic”关键字可能不是解决问题的正确方法(在C#4和“dynamic”之前,人们已经编写了很棒的程序 :))。也许Shaza必须使用反射器,如果类型确实是_end_user定义的,但他没有说任何具体的东西。 - Philip Daubmeier
非常抱歉我之前表述不够清晰。我正在开发一个应用程序,供开发人员使用来构建递归方法。我需要回答之前的问题,因为我正在通过开发人员提供给我的一些输入来构建该方法,其中一个输入应该是该方法的输出,可以通过下拉框选择。 - Lisa
我询问这一切,是因为在C#中没有办法完全按照你在问题描述中所说的去做。但有几种方法可以表达相同的意思(反射器/泛型/dynamic关键字/被强制转换成某种类型的object)。我只是不确定哪种方法最适合你的应用程序,并能产生干净而有表现力的代码。这应该是我们的目标,对吧? - Philip Daubmeier
显示剩余2条评论
4个回答

2
你需要的是泛型。可以在这里阅读简介。
例如,你可以声明一个类,让用户定义的类型放在其中,像这样:
class MyClass<T>
{
    private T instance1 = default(T);

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

    //... some more code
}

很抱歉,泛型并不是 OP 寻找的东西。Shaza 谈论的是最终用户使用正在运行的应用程序,而不是使用他的代码的程序员。类型应该在运行时选择。 - Maciej Hehl
@Maciej:那只是猜测,只要Shaza没有说出他真正想做的事情。 - Philip Daubmeier
我在基础帖子中评论了我正在工作的内容,顺便说一句,我是一个女生:) - Lisa
@Shaza:抱歉,之前没有听说过您的名字。 - Philip Daubmeier

1

如果你没有更多地解释你想要达到的目的的细节,你可以使用一个通用方法*,你可以使用 C# 4的 dynamic 关键字,或者你可以使用反射来创建给定类型的实例。

*如果类型可以在编译时被知道,或者它是有限集中的一种类型,并且你选择了一个在编译时命名的类型(例如:用户将说其中之一:intchardouble,然后您将相应地使用正确的泛型)。如果类型完全不确定,您仍需要使用反射在运行时使用给定的类型实例化泛型。


+1。是的,如果像你说的那样,在编译时已知一组定义的类型集合,我考虑使用泛型来解决它。如果不与动态语言进行交互,我不喜欢使用“dynamic”。我认为将C#变成它不是的东西:一个动态语言,这相当丑陋。 - Philip Daubmeier

0

我猜这就是你要找的内容:

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

在.NET 4中,动态关键字可能更加有效和方便。

0

C# 4.0 中的动态关键字


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接