我有以下功能:
public static bool PopulateModelByDictionaryOne()
{
var model = new ModelOne();
foreach (var Item in Data.DictOne)
{
model.Dictionary.Add(Item.Key, Item.Value);
}
return true;
}
Dictionary是由模型设置的公共字典。
我想使这个类变量允许自定义模型和自定义Data.Dict。我发现了以下内容(尚未测试):
var model = Activator.CreateInstance(Type.GetType(className));
其中className是传递给函数的变量。
问题:
1)在这种情况下如何引用model.Dictionary(所有模型类都有一个字典)
2)如何制作Data.DictOne变量?
答案 0 :(得分:1)
我假设以下内容:
您有某种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()
这样,您可以随意选择DataSource / Model对。你的方法尽可能通用:)。此外,您可以传递模型的实例,而不是在此方法中实例化它,这样您就可以摆脱Reflection
约束。通过使用该方法,您无需使用public class ValueSelector extends Linerlayout {
View rootView;
TextView valueTextView;
public ValueSelector(Context context) {
super(context);
init(context);
}
public ValueSelector(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
//do setup work here
rootView = inflate(context, R.layout.your_custom_view, this);
}
}
。