可以从变量字典中填充变量类[关闭]

问题描述 投票:1回答:1

我有以下功能:

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

c# dictionary model
1个回答
1
投票

我假设如下:

  1. 你有某种DataSource这个数据源有一个DictionaryKeyValue的某些数据类型
  2. 你有一个名为PopulateModelByDictionaryOne的方法,这个方法将DataSource作为Parameter并创建某个模型的新实例,然后填充Dictionary类型的属性,其KeyValue类型与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;
    }

这样,您可以随意选择DataSource / Model对。你的方法尽可能通用:)。此外,您可以传递模型的实例,而不是在此方法中实例化它,这样您就可以摆脱new()约束。通过使用该方法,您不需要使用Reflection

© www.soinside.com 2019 - 2024. All rights reserved.