将对象附加到IEnumerable<>通过反思

时间:2009-09-02 03:15:25

标签: c# generics reflection

我需要能够通过反射访问属性,并且知道此属性是IEnumerable,请向其附加一个对象。

这样的事情:

Object o;
MemberInfo m;

Array arr; // Except use IEnumerable, may have to take account of value/ref types
arr = (Array)((PropertyInfo)m).GetValue(o, null); }

List<o.GetType()> newArr = new List<o.GetType()>(); /* fails */
newArr.AddRange(arr);
newArr.Add(o);

((PropertyInfo)m).SetValue(o, newArr.ToArray(), null);

你能在我出错的地方帮助我: - )

解决方案:

参见接受的答案评论。另外(Get the actual type of a generic object parameter)也有帮助。

2 个答案:

答案 0 :(得分:4)

一旦你有一个IEnumerable类型,使用这样的东西来附加它:

public static IEnumerable<T> Append<T>(this IEnumerable<T> original, T next)
{
    foreach (T item in original) yield return item;
    yield return next;
}

public static IEnumerable<T> Append<T>(this IEnumerable<T> original, params T[] next)
{
    foreach (T item in original) yield return item;
    foreach (T item in next) yield return item;
}

public static IEnumerable<T> Append<T>(this IEnumerable<T> original, IEnumerable<T> next)
{
    foreach (T item in original) yield return item;
    foreach (T item in next) yield return item;
}

答案 1 :(得分:2)

听起来你实际上是在询问如何根据编译时未知类型创建List<T>。为此,你将不得不使用更多的反射魔法:

Type genericListType = typeof(List<>);
Type listType = genericListType.MakeGenericType(o.GetType());
object listInstance = Activator.CreateInstance(listType);

这会在运行时类型中创建List<T>

但实际上,如果您只使用ArrayList:

,您的代码会更简单
ArrayList list = new ArrayList(arr);
list.Add(o);
Array newArray = list.ToArray(o.GetType());