C# 有没有其他方法可以不使用new创建实例?

C# 有没有其他方法可以不使用new创建实例?,c#,oop,C#,Oop,这是我的类employee,另一个来自employee,这只是一个示例类: public class Employee { public int EmployeeID { get; set; } public Type type { get; set; } public string Name { get; set; } } public class Manager : Employee { public void DoSomething() {

这是我的类employee,另一个来自employee,这只是一个示例类:

public class Employee
{
    public int EmployeeID { get; set; }
    public Type type { get; set; }
    public string Name { get; set; }
}

public class Manager : Employee
{
    public void DoSomething()
    {
        // Bla bla
    }
}

public class Salesman : Employee
{
    public void DoAnotherSomething()
    {
        // Bla bla
    }
}
如您所见,我的Employee类有一个Type属性,其中包含Manager或saller。我不想使用很多开关情况,所以有没有办法在知道类型变量的情况下创建对象

更新1:

好吧,我是说。在我的真实节目中。我使用了许多开关案例来创建对象:

        Employee employee = new Employee();
        // I do somethings to get the values to employee I store it in a Employee list

        // Then I need to create the particular object of each one, I need to travel all 
        // the list an create its instance
        switch (employee.Type)
        {
            case Manager:
                employee = new Manager();

                // Some stuff
                break;
            case Salesman:
                employee = new Salesman();

                // Some stuff
                break;
        }

在我的真实代码中,我需要使用130个案例,或多或少。因此,我想实现另一种方法来避免这种情况。

如果您试图避免切换到设置Type属性,您可以在Employee上定义一个构造函数,该构造函数将Type作为参数:

protected Employee(Type type) { 
    this.type = type;
}
并从每个子类的构造函数调用它:

public Manager() : base(typeof(Manager)) { }
此模式通常还要求将Employee声明为抽象,这样您就不会意外地创建一个类型未知的Employee。如果希望雇员只是雇员,可以将其作为一个具体的非抽象类,并定义一个调用我建议的新构造函数的构造函数,如下所示:

public Employee() : this(typeof(Employee)) { }

与其继承类Employee,为什么不创建一个接口IEEmployee并让您要创建的每个Employee类型类实现该接口?

您永远不想打开类型。这是错误使用OOP的代码味道。相反,您应该始终努力以多态方式使用类。如果我没弄错你的问题,你有一个员工,想再做一个相同类型的员工。这称为虚拟构造函数习惯用法,通常使用虚拟克隆方法处理:

class Employee
{
  public virtual Employee Clone();
};

class Manager
{
  public override Manager Clone()
  {
     return new Manager(this);
  }
};
或者类似的事情。

你可以

var factory = new Dictionary<Type, Func<Employee>> {
    Type.Mgr, ()=>new Manager(),
    Type.Sales, ()=>new Salesman()
};

假设这就是你的问题所要求的。但我同意其他海报,如果这是您所要求的,通常认为这是一种不好的做法。

这里听起来您希望工厂模式使用一些描述符,创建一个实例,并通过静态方法返回它:

class EmployeeFactory
{
  public static Employee NewEmployee(EmployeeType type)
  {
     Employee emp = null;
     switch (type)
     {
        case EmployeeType.Manager :
           emp = new Manager();
           break;
        case EmployeeType.Salesman :
           emp = new Salesman();
           break;
     }
     return emp;
  }
}

因为您已经拥有了该类型,所以可以使用System.Activator

类型=管理者的类型; var manager=manager Activator.CreateInstancetype;
理解商业案例将有助于具体回答问题。不清楚为什么要实例化一个已经知道类型的对象。与其将类型参数传递给factory方法,为什么不直接传递Func或对象?

基于实例的值创建类型的实例?这就像时光倒流吗?也许只是我,但我不明白这个问题。它是关于在不使用新实例的情况下创建实例的吗?它是否试图避免开关箱什么开关箱?是关于在不知道类型的情况下创建类型变量吗?OP能澄清一下吗?你可以用Activator.CreateInstance创建一个实例,但我有一种感觉,如果你仔细想想,你真的不想这么做。你想实现什么?你能解释类型属性的意图吗?对象的声明类型始终可以使用then GetType方法解析。似乎你想在剂量测定法周围使用多态性?你为什么这样做?那是什么类型的?您已经有了一种或另一种类型的具体派生对象。你可以通过简单的is检查在代码中测试它们是什么。这看起来是一个很好的实践。虽然我不确定是否必须在Employee中声明Type属性,但请检查更新。是的,我想这是最好的选择。所以如果我使用这个接口。能给我一份员工名单吗?请检查我的更新,你可以有一个列表。如果您需要所有类类型共享公共方法,您可以更进一步,拥有一个名为EmployeeBase的基类,每个类类型都将继承该基类。请给我一个示例
class EmployeeFactory
{
  public static Employee NewEmployee(EmployeeType type)
  {
     Employee emp = null;
     switch (type)
     {
        case EmployeeType.Manager :
           emp = new Manager();
           break;
        case EmployeeType.Salesman :
           emp = new Salesman();
           break;
     }
     return emp;
  }
}