模块化应用程序通用 DTO

Modular application generic DTO

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

接口:

public interface IField
{ }

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

实施class:

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

现在我可以用我的参数创建一个字典并调用在另一个未引用的程序集中实现的方法(我使用反射获取它):

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' 没有 属性 值(通用类型),因为我使用 IField 接口定义字典元素,而在 'MyMethod' 中我们无法知道参数的正确实现。

对实现我的目标有什么建议吗?

泛型不是这样工作的。

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

但是,您不能混合类型,因为当您创建 class 的实例时,您的 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,这将要求您对类型进行装箱和拆箱:

public 接口 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"];

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

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