将List <keyvaluepair>转换为特定的ICollection类型C#

时间:2017-02-10 12:40:31

标签: c#

`请新手编程,并在解决方案的最后几个小时内搜索但是找不到一个;所以这是我的问题:

我有List<KeyValuePair<string, object>>我想在运行时将值对转换为ICollection<T>

其中T是对象的类型(值对)。

转换的目的是将值传递给PropertyInfo.SetValue(obj,val)方法。其中val是ICollection

public object TheMEthod( object objreactor, List<KeyValuePair<string, object>> objactor) {

  Type tyr2 = typeof(List<>).MakeGenericType(objactor.First().Value.GetType());

  ICollection list = (ICollection) Activator.CreateInstance(tyr2);
  list = (ICollection) objactor.Select(l => l.Value).Distinct().ToList();

                objreactor.GetType().GetProperty(objactor.First().Key)?.SetValue(objreactor, Convert.ChangeType( list, objactor.First().Value.GetType()), null);

            //else return exception

            return objreactor;


        }

这返回错误对象必须实现iconvertible c#“

1 个答案:

答案 0 :(得分:2)

如果键值对的值为object,但您需要将其作为特定对象T,则需要将其强制转换。这仅在Value 确实是正确类型时才有效。

List<KeyValuePair<string, object>> list = ....

ICollection<TheRealObject> coll = list.Select(x => x.Value)  // Select the Values
                                      .Cast<TheRealObject>() //Cast them to your type
                                      .ToList(); // turn it to a list

请注意,List<T> ICollection<T>,因此您几乎可以肯定将此列表传递给期望SetProperty

ICollection<T>