【问题标题】:MyController class must produce class according to the enum typeMyController 类必须根据枚举类型产生类
【发布时间】:2019-07-23 15:11:38
【问题描述】:

GenoTipController 必须根据枚举类型生成类。我有 3 个班级:_Company、_Muayene、_Radyoloji。我也有 CompanyView 类 GetPersonel 方法。如果您查看 GenoTipController,我的代码需要重构。你能听懂我说话吗?我需要根据 ewnum 类型的类,我必须生成类。例如; case DataModelType.Radyoloji 它必须返回 radyoloji= new Radioloji 。一切都必须是一个开关盒?


 public abstract class _Company
    {
        public abstract List<Personel> GetPersonel();

        public abstract List<Prim> GetPrim();

        public abstract List<Finans> GetFinans();
    }

    public abstract class _Radyoloji
    {
        public abstract List<string> GetRadyoloji();
    }
    public abstract class _Satis
    {
        public abstract List<string> GetSatis();
    }
    public abstract class _Muayene
    {
        public abstract List<string> GetMuayene();
    }

    public class Company: _Company
    {

        public override List<Personel> GetPersonel()
        {
            throw new NotImplementedException();
        }

        public override List<Prim> GetPrim()
        {
            throw new NotImplementedException();
        }

        public override List<Finans> GetFinans()
        {
            throw new NotImplementedException();
        }
    }

    public class Radyoloji : _Radyoloji
    {
        public override List<string> GetRadyoloji()
        {
            throw new NotImplementedException();
        }
    }

    public class Satis : _Satis
    {
        public override List<string> GetSatis()
        {
            throw new NotImplementedException();
        }
    }

    public class Muayene : _Muayene
    {
        public override List<string> GetMuayene()
        {
            throw new NotImplementedException();
        }
    }

 public class GenoTipController
    {
        public _Company GenerateCompany(DataModelType modeltype)
        {
            _Company company = null;
            switch (modeltype)
            {
                case DataModelType.Radyoloji:
                    break;
                case DataModelType.Satis:
                    break;
                case DataModelType.Muayene:
                    break;
                case DataModelType.Company:
                    company = new Company(); 
                    break;
                default:
                    break;
            }

            return company;

        }

        public _Muayene GenerateMuayene(DataModelType modeltype)
        {
            _Muayene muayene = null;
            switch (modeltype)
            {
                case DataModelType.Radyoloji:
                    break;
                case DataModelType.Satis:
                    break;
                case DataModelType.Muayene:
                    muayene = new Muayene();
                    break;
                case DataModelType.Company:
                    break;
                default:
                    break;
            }

            return muayene;

        }

        public _Radyoloji GenerateRadyoloji(DataModelType modeltype)
        {
            _Radyoloji radyoloji = null;
            switch (modeltype)
            {
                case DataModelType.Radyoloji:
                    radyoloji = new Radyoloji();
                    break;
                case DataModelType.Satis:
                    break;
                case DataModelType.Muayene:

                    break;
                case DataModelType.Company:
                    break;
                default:
                    break;
            }

            return radyoloji;

        }
    }

    public class CompanyView
    {
        public static List<Personel> GetPersonel()
        {
            GenoTipController controller = new GenoTipController();
            _Company company = controller.GenerateCompany(DataModelType.Company);
             return company.GetPersonel();

        }
 }

    public enum DataModelType
    {
        Radyoloji,
        Satis,
        Muayene,
        Company
    }
}

如果使用 oleksiy.t 方法:

 public class GenoTipController
    {


        public object CreateByEnum(DataModelType modeltype)
        {
            string enumText = modeltype.ToString(); // will return for example "Company"
            Type classType = Type.GetType(enumText); // the Type for Company class
            object t = Activator.CreateInstance(classType); // create an instance of Company class

            return t;
        }
    }

    public class CompanyView
    {
        public static List<Personel> GetPersonel()
        {
            GenoTipController controller = new GenoTipController();
            _Company company = controller.CreateByEnum(DataModelType.Company);
             return company.GetPersonel();

        }
   }
    public enum DataModelType
    {
        Radyoloji,
        Satis,
        Muayene,
        Company
    }

我面对面错误:我喜欢 oleksiy 方法,但我该如何使用它?

【问题讨论】:

  • 您需要一个隐式类型转换,如错误消息所述

标签: c# .net visual-studio design-patterns architecture


【解决方案1】:

看看factory pattern,我认为你正在寻找它。

示例代码。

public interface IPizza
{
    decimal Price { get; }
}

public class HamAndMushroomPizza : IPizza
{
    decimal IPizza.Price
    {
        get
        {
            return 8.5m;
        }
    }
}

public class DeluxePizza : IPizza
{
    decimal IPizza.Price
    {
        get
        {
            return 10.5m;
        }
    }
}

public class HawaiianPizza : IPizza
{
    decimal IPizza.Price
    {
        get
        {
            return 11.5m;
        }
    }
}

public class PizzaFactory
{
    public enum PizzaType
    {
        HamMushroom,
        Deluxe,
        Hawaiian
    }

    public static IPizza CreatePizza(PizzaType pizzaType)
    {
        IPizza ret = null;

        switch (pizzaType)
        {
            case PizzaType.HamMushroom:
                ret = new HamAndMushroomPizza();

                break;
            case PizzaType.Deluxe:
                ret = new DeluxePizza();

                break;
            case PizzaType.Hawaiian:
                ret = new HawaiianPizza();

                break;
            default:
                throw new ArgumentException("The pizza type " + pizzaType + " is not recognized.");
        }

        return ret;
    }
}

public class PizzaLover
{
    public static void Main(string[] args)
    {
        Dictionary<PizzaFactory.PizzaType, IPizza> pizzas = new Dictionary<PizzaFactory.PizzaType, IPizza>();

        foreach (PizzaFactory.PizzaType pizzaType in Enum.GetValues(typeof(PizzaFactory.PizzaType)))
        {
            pizzas.Add(pizzaType, PizzaFactory.CreatePizza(pizzaType));
        }

        foreach (PizzaFactory.PizzaType pizzaType in pizzas.Keys)
        {
            System.Console.WriteLine("Price of {0} is {1}", pizzaType, pizzas[pizzaType].Price);
        }
    }
}

Output:
Price of HamMushroom is 8.5
Price of Deluxe is 10.5
Price of Hawaiian is 11.5

【讨论】:

  • 彼得G;我需要一个工厂,我也知道模式。但是你有一个界面:IPizza,但我有更多界面。我在上面重新排列了我的代码。 İlease Look:)
【解决方案2】:

您可以对枚举名称和类名称使用命名约定,并通过反射创建实例:

namespace MyNamespace
{
    public enum DataModelType { Company, Person }

    public class Company
    {
    }

    public class Person
    {
    }

    public class ObjectFactory
    {
        public static object CreateByEnum(DataModelType modelType)
        {
            string enumText = modelType.ToString(); // will return for example "Company"
            Type classType = Type.GetType("MyNamespace." + enumText); // the Type for Company class
            object t = Activator.CreateInstance(classType); // create an instance of Company class

            return t;
        }
    }
}

【讨论】:

  • 我重新排列了我的代码 oleksiy。我认为您的解决方案很好,但返回错误。
  • 我错过了 Type.GetType 中的命名空间名称
【解决方案3】:

使用您在编辑后描述的方法,您需要将对象转换为类型 _Company:

_Company company = controller.CreateByEnum(DataModelType.Company) as _Company;

_Company company = (_Company)controller.CreateByEnum(DataModelType.Company);

虽然我建议不要使用该方法并建议使用 switch 语句,因为这样可以避免运行时错误。

也许我无法从您的示例中看到它(或者可能为时已晚),但如果这些项目都不是从相同的基类继承或实现相同的接口,那么您将必须知道您正在使用的类当您实例化它以访问其任何成员时。

【讨论】:

  • 谢谢!很多,但哪个最好?
猜你喜欢
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多