日期:2014-05-18  浏览次数:20804 次

关于“泛型”与“反射”的一点问题请教
C# code

public class DNodeCollection<T> : List<TreeStructure<T>> 
    {
        public DNodeCollection(TreeStructure<T> belongTo)
        {
            Belongto = belongTo; 
        }

        public TreeStructure<T> Belongto
        {
            get;
            set;
        }

        public new void Add(TreeStructure<T> node)
        {
            node.Level = Belongto.Level + 1;
            node.Parent = Belongto;
            base.Add(node);
        }
    }



这样的一个对象,我如何用反射,来创建一个实例?
我使用了如下方式,通过反射来创建实例,最终报错无法解决,请各位指教。
C# code

object obj = Activator.CreateInstance((typeof(List<>).MakeGenericType(type.GetGenericArguments())));
IList iList = (IList)obj;
obj.Add(new TreeStructure<string>);//报错,Add方法里,必须是String类型,因为DNodeCollection<T>为DNodeCollection<String>





------解决方案--------------------
Add需要什么类型参数,而且new TreeStructure<string>,也应该为
new DNodeCollection<string>(new TreeStructure<string>());
------解决方案--------------------
如果泛型参数T为String的话,生成的对象obj类型应该是List<String>,所以Add方法的参数必须是String。另一方面,DNodeCollection<T>是从List<T>继承的,而List<T>的Add方法没有标识为virtual,所以你用new来修饰Add方法,但这就意味着必须显式地用DNodeCollection<T>.Add方法才能使用你的版本。所以至少有两个地方要改,一是CreateInstance时,应该用typeof(DNodeCollection<>)而不是现在的typeof(List<>);二是DNodeCollection<T>要显式的实现IList接口中的Add方法。