模块化应用程序通用DTO

时间:2017-07-13 21:36:27

标签: c# asp.net .net .net-4.6.1

我想将通用参数的列表/字典(可以是同一集合中的不同类型)传递给模块化应用程序中的方法。 我希望我的代码可以更好地解释它。

接口:

public interface IField
{ }

public interface IField<T> : IField
{
    T Value { get; }
}

已实施的课程:

public class Field<T> : IField<T>
{      
    public Field(T value)
    {
        Value = value;
    }
    public T Value { get; set; }
}

现在我可以使用我的参数创建一个Dictionary并调用一个在未引用的不同程序集中实现的方法(我使用反射得到它):

static void Main(string[] args)
{
    var dicFields = new Dictionary<string, IField>();
    dicFields.Add("param1", new Field<string>("Hello"));
    dicFields.Add("param2", new Field<int>(15));

    MyMethod(dicFields);
}

现在,在'MyMethod'中,我想获取字典中特定参数的值:

public void MyMethod(IDictionary<string, IField> parameters)
{
    var param2 = parameters["param2"];
}

问题在于'param2'没有属性Value(泛型类型),因为我使用IField接口来定义字典元素,而在'MyMethod'中我们无法知道参数的正确实现。

有任何建议来实现我的目标吗?

2 个答案:

答案 0 :(得分:0)

泛型不通过这种方式工作。

要获取通用类型,您需要使用字典中的IField<T>接口和方法。

但是,您无法混合类型,因为在创建类的实例时,IField将仅限于T:

public interface IField
{

}
public interface IField<T> : IField
{
    T Value { get; }
}
public class Field<T> : IField<T>
{
    public Field(T value)
    {
        Value = value;
    }
    public T Value { get; set; }
}
public void Generic()
{

    var dicFields = new Dictionary<string, IField<string>>();
    dicFields.Add("param1", new Field<string>("Hello"));
    dicFields.Add("param2", new Field<string>("Hello"));

    MyMethod<String>(dicFields);

}
public void MyMethod<T>(IDictionary<string, IField<T>> parameters)
{
    var param2 = parameters["param2"].Value;
}

如果你想混合类型,你需要使用IField,这需要你打包和取消打包你的类型:

公共接口IField     {

}
public interface IField<T> : IField
{
    T Value { get; }
}
public class Field<T> : IField<T>
{
    public Field(T value)
    {
        Value = value;
    }
    public T Value { get; set; }
}
public void Generic()
{

    var dicFields = new Dictionary<string, IField<object>>();
    dicFields.Add("param1", new Field<object>("Hello"));
    dicFields.Add("param2", new Field<object>(2));

    MyMethod<object>(dicFields);

}
public void MyMethod<T>(IDictionary<string, IField<T>> parameters)
{
    var param2 = parameters["param2"].Value;
}

虽然这被认为是不好的做法,但您可以使用Dictionary<string, Dynamic>

Dictionary<string, dynamic> dict = new Dictionary<string, dynamic>();
dict.Add("value1", "a");
dict.Add("value2", 2);
dict.Add("value3", 3);
int result = dict["value2"] + dict["value3"];

答案 1 :(得分:0)

管理您尝试执行的操作的一种方法是向IField添加访问方法,以便您获得object值和类型。

public interface IField
{
  object GetValue { get; }
  Type GetValueType();
}