在C#中如何创建一个对象而不使用new关键字?

10

在C#中有没有一种方法可以在不使用new关键字的情况下创建一个对象,就像Java中的class.forname();

我想动态地创建一个类的对象。对象的创建可能取决于用户的输入。
我有一个基类x,它有5个子类(a、b、c、d、e)。我的用户输入将是a或b或...e类名。使用这个输入,我需要创建那个类的一个对象。我该怎么做?


2
您想要实现什么目标? - GazTheDestroyer
1
我想动态地创建一个类的对象。对象的创建可能取决于用户的输入。 - Abhay Kumar
1
谁会点赞这样的问题?“这个问题表现出了研究努力;”(哦?)“它有用且清晰”(哦?)。 - CodeCaster
我有一个基类x,它有5个子类(a、b、c、d、e)。我的用户输入将是a或b或...e,使用这个输入,我需要创建该类的一个对象。我该如何做到这一点? - Abhay Kumar
2
它取决于它们的构造函数。如果它们接受相同的参数,你可以考虑使用工厂模式。 - Kralizek
显示剩余4条评论
5个回答

15

你可以使用Activator类

Type type = typeof(MyClass);
object[] parameters = new object[]{1, "hello", "world" };
object obj = Activator.CreateInstance(type, parameters);
MyClass myClass = obj as MyClass;

5
请注意,这种方法明显较慢,不应仅仅为了避免使用 new 操作符而使用。 - Marc Gravell
17
我看到里面有一个 new 关键字。 :P - CodeCaster

3
你是指静态类吗?
static class Foo
{
    public static void Bar()
    {
        Console.WriteLine("Foo.Bar()");
    }
}

您可以调用Foo.Bar();
但最好解释一下您要做什么。 "创建对象而不使用new"是您针对正在遇到的问题想出来的一个解决方案。仅仅解释该问题可能会揭示更简单的解决方法。
编辑:根据您的评论“我想动态创建一个类的对象。对象的创建可能取决于用户的输入”,您似乎需要一个工厂
因此,类似以下内容可能已经足够了:
static class PizzaFactory
{
    static Pizza CreatePizza(String topping)
    {
        if (topping == "cheese")
        {
            return new CheesePizza();
        }
        else if (topping == "salami")
        {
            return new SalamiPizza();
        }
    }
}

class Pizza { }
class CheesePizza : Pizza { }
class SalamiPizza : Pizza { }

必要时添加接口或抽象类。


0

你可以使用 default 关键字,但它只会对值类型返回一个实例:

var s = default(string); // null
var i = default(int);    // integer (0)

0

-4

你也许可以用以下方式实现

typeof(MyType)

5
抱歉-被下投票了,因为答案没有清楚说明如何执行此操作。 - Tim Barrass

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