我需要能够通过反射访问属性,并且知道此属性是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)也有帮助。
答案 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());