我有以下函数:
public static bool PopulateModelByDictionaryOne()
{
var model = new ModelOne();
foreach (var Item in Data.DictOne)
{
model.Dictionary.Add(Item.Key, Item.Value);
}
return true;
}
字典是由模型设置的公共字典。
我想使这个类变量允许自定义模型和自定义 Data.Dict。我发现了以下内容(尚未测试):
var model = Activator.CreateInstance(Type.GetType(className));
其中类名是要传递给函数的变量。
问题:
1) 如何引用模型。本例中的字典(所有模型类都有一个字典)
2)如何使Data.DictOne成为变量?
我假设以下内容:
-
您有某种
DataSource
此数据源具有Dictionary
某些数据类型的Key
和Value
-
您有一个名为
PopulateModelByDictionaryOne
此方法采用的方法DataSource
Parameter
并创建某个实例的新实例 建模,然后填充类型为Dictionary
的属性,其Key
并且Value
类型与DataSource
类型匹配。
如果我的假设是正确的。您可以为模型创建泛型接口类型,IDicationaryDataModel<TKey,TValue>
此接口包含IDictionary<TKey,TValue>
类型的单个属性,因此您可以在实现此接口的任何模型上强制存在此属性。
public interface IDicationaryDataModel<TKey, TValue>
{
IDictionary<TKey,TValue> Dictionary { get; set; }
}
然后创建另一个泛型接口类型IDataSource<TKey,TValue>
此接口将强制数据源上存在类型IDictionary<TKey,TValue>
的属性。
public interface IDataSource<TKey,TValue>
{
IDictionary<TKey,TValue> DictOne { get; set; }
}
因此,您的模型将实现如下接口:
public class ModelOne : IDicationaryDataModel<string, string>
{
public IDictionary<string, string> Dictionary { get; set; }
}
您的数据源将实现如下接口:
public class DataSource : IDataSource<string, string>
{
public IDictionary<string, string> DictOne { get; set; }
}
因此,您的方法是:
public static bool PopulateModelByDictionaryOne<TModel,TDataSource,TKey,TValue>(TDataSource dataSource)
where TModel:IDicationaryDataModel<TKey,TValue>,new()
where TDataSource:IDataSource<TKey,TValue>
{
var model = new TModel();
foreach (var Item in dataSource.DictOne)
{
model.Dictionary.Add(Item.Key, Item.Value);
}
return true;
}
这样,您可以根据需要自由选择数据源/模型对。您的方法尽可能通用,因为它可能是:)。此外,您可以传递模型的实例,而不是在此方法中实例化它,这样您就可以摆脱new()
约束。通过使用该方法,您无需使用Reflection
.