简单地做modelType.ToString()是不够的,我如何通过Activator.CreateInstance使用它?

时间:2010-04-17 07:21:05

标签: .net design-patterns architecture oop c#-3.0

  public class MyController
    {
        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()
        {
            MyController controller = new MyController();
            _Company company = controller.CreateByEnum(DataModelType.Company) as _Company;
            return company.GetPersonel();
        }
    }

    public enum DataModelType
    {
        xyz,
        klm,
        tucyz,
        Company
    }

是的,我同意Activator.CreateInstance()非常有用。不幸的是,我需要传递正确的类型。这意味着构建正确的字符串以传递给Type.GetType()。如果我在上面发布的代码中跟踪对Controller.CreatebyEnum()的调用,那么仅仅执行modelType.ToString()是不够的,即使对于DataModelType.Company也是如此。 我的解决方案是维护瓶颈。 什么会更好的是取得modelType.ToString()的结果,然后递归搜索在当前AppDomain中加载的所有程序集中找到的所有类型。根据MSDN,Type.GetType()只搜索当前的调用程序集和mscorlib.dll。我怎样才能做到这一点? 。我需要最佳表现?

1 个答案:

答案 0 :(得分:0)

我使用Activator.CreateInstance作为我框架的核心部分,主要用于实现我的数据访问提供程序(由接口定义)的实现。

因为我知道我想要哪一个,所以我只需传入一个AppSetting键 - 这样你就可以通过配置改变你使用的那个。

我同意凯恩 - 我不能100%确定你的问题是什么。

如果你传入一个枚举,那不是建议你知道你想要创建什么类型(即使只是在一般意义上,而不是一个明确的类型)?

在某些时候,某些事情必须要决定实施什么 - 你知道这是谁/是什么?可能的选择:

  1. Via config:适用于需要控制但实际上并未经常更改设置的情况。也适用于广义概念(客户=设置A;产品=设置B等)。
  2. 使用相关数据将目标类型存储在数据库中 - 允许您将任何类实例绑定到特定实现(将传递给激活器)。这允许更精细的控制程度 - 但该类型如何决定并存储在第一位?
  3. 而不是使用ToString()(您可以重载/替换)使用OO将新成员添加到相关的每个类(可能是一个简单的接口),其中新成员返回激活器所需的信息。 / LI>

    可能只是因为你对枚举本身的要求过高?您仍然可以使用枚举来控制执行,但是您需要分离实例的创建方式。

    这是否足够清楚,还是人们想要/需要代码示例?