可以从变量字典填充变量类

时间:2017-12-23 10:12:17

标签: c# dictionary model

我有以下功能:

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变量?

1 个答案:

答案 0 :(得分:1)

我假设以下内容:

  1. 您有某种DataSource此数据源有 Dictionary KeyValue的某些数据类型的PopulateModelByDictionaryOne

  2. 这个方法有一个名为DataSource的方法 ParameterDictionary并创建某个新实例 模型,然后填充Key Value类型的属性 和DataSource类型匹配IDicationaryDataModel<TKey,TValue>类型的类型。

  3. 如果我的假设是正确的。您可以为模型创建通用接口类型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); } }