在不使用接口的情况下根据字符串值实例化 class 或对一组 class 进行分组
Instantiating a class based on a string value or grouping a set of classes without using an Interface
我有一些接收字符串的代码 - 取决于实例化 class 的那个字符串,例如如果它的 "customer" 它执行 new CustomerData() 等。将有 10-30 个不同的字符串值,每个都有一个需要实例化的关联 class:
我确实想到了用字典来解决这个问题:
public IData data; //the classes are currently in an interface but this is looking impractical due to differing methods.
data = dataLookup["dataType"];
dataLookup = new Dictionary<string, **what data type is this?**>
{
{ "customer", new CustomerData() },
{ "company", new CompanyData() }
...etc 10-30 rows...
};
问题是我不知道如何在字典中设置数据类型 - 我不认为将所有 classes 添加到接口是答案。虽然classes都是相关的(对于application都是"data"),但是每个数据中只有大约一半的方法class是相同的,其余的方法都是独一无二的每个数据class。我在接口上读到我可以在每个 class 中添加未使用的方法并且不对它们进行操作,但听起来确实有点混乱。
根据字符串值实例化正确 class 的最干净的解决方案是什么?
由于你们所有人 类 都有无参数构造函数(根据评论),作为一种选择,您可以管理一个字典,其中 string
作为键,Type
作为值(而不是具体实例)。
var dict = new Dictionary<string, Type>()
{
{ "customer", typeof(CustomerData) },
{ "company", typeof(CompanyData) },
};
并按以下方式使用它,从字典中按键获取类型并创建该类型的实例。但是这个实例有一个 Object
类型,因为你不能在编译期间使用运行时已知的类型。这里可能的方法是使用 Convert.ChangeType
并将结果存储在 dynamic
类型变量
中
var type = dict["customer"];
var data = Activator.CreateInstance(type);
dynamic result = Convert.ChangeType(data, type);
我有一些接收字符串的代码 - 取决于实例化 class 的那个字符串,例如如果它的 "customer" 它执行 new CustomerData() 等。将有 10-30 个不同的字符串值,每个都有一个需要实例化的关联 class:
我确实想到了用字典来解决这个问题:
public IData data; //the classes are currently in an interface but this is looking impractical due to differing methods.
data = dataLookup["dataType"];
dataLookup = new Dictionary<string, **what data type is this?**>
{
{ "customer", new CustomerData() },
{ "company", new CompanyData() }
...etc 10-30 rows...
};
问题是我不知道如何在字典中设置数据类型 - 我不认为将所有 classes 添加到接口是答案。虽然classes都是相关的(对于application都是"data"),但是每个数据中只有大约一半的方法class是相同的,其余的方法都是独一无二的每个数据class。我在接口上读到我可以在每个 class 中添加未使用的方法并且不对它们进行操作,但听起来确实有点混乱。
根据字符串值实例化正确 class 的最干净的解决方案是什么?
由于你们所有人 类 都有无参数构造函数(根据评论),作为一种选择,您可以管理一个字典,其中 string
作为键,Type
作为值(而不是具体实例)。
var dict = new Dictionary<string, Type>()
{
{ "customer", typeof(CustomerData) },
{ "company", typeof(CompanyData) },
};
并按以下方式使用它,从字典中按键获取类型并创建该类型的实例。但是这个实例有一个 Object
类型,因为你不能在编译期间使用运行时已知的类型。这里可能的方法是使用 Convert.ChangeType
并将结果存储在 dynamic
类型变量
var type = dict["customer"];
var data = Activator.CreateInstance(type);
dynamic result = Convert.ChangeType(data, type);