【问题标题】:Constructor of type missing - Adding to a generic array with generic method缺少类型的构造函数 - 使用泛型方法添加到泛型数组
【发布时间】:2015-01-07 17:04:30
【问题描述】:

我正在尝试创建如下的泛型类数组,但是,我遇到了麻烦。第一个问题是调用 AddGenericComponent 方法时出现错误“MissingMethodException:未找到 Dog 类型的构造函数”。此方法应将任何放入其中的类添加到组件数组中,并返回刚刚添加的组件,以便以类似于所见“Test()”的方式进行修改。有没有人有关于如何做到这一点的建议或解决方案?

public void Test()
{
    MyClass myClass = new MyClass();
    Dog dog = myClass.AddGenericComponent<Dog>();
    dog.name = "Fluffy";
    Console.Writeline(dog.name);
    //testing the accessor
    dog = myClass.GetGenericComponent<Dog>();
    dog.name = "Fluffy mod";
    Console.Writeline(dog.name);
}


public class MyClass
{
   //must be an array, not list
   GenericComponent<Object>[] components = new GenericComponent<Object>[1];
   public T AddGenericComponent<T>()
   {
       GenericComponent<Object>[] newArray = new GenericComponent<Object>[components.Length + 1];
       components.CopyTo(newArray, 0);
       components = newArray;
       components[components.Length - 1] = new GenericComponent<Object>();
       return (T)Activator.CreateInstance(typeof(T), new GenericComponent<Object> { });
   }
   public T GetGenericComponent<T>()
   {
      return (T)Array.Find(components, c => c.GetType() == typeof(T)).component;
   }
}

public class GenericComponent<T> where T: new()
{
   public T component;
   public GenericComponent()
   {
       component = new T();
   }
}

public class Dog
{
   public string name = "";
   public Dog(){}
   public Dog(string name)
   {
      this.name = name;
   }

}

编辑:

我想我已经解决了。

 public T AddGenericComponent<T>()
 {
    GenericComponent<Object>[] newArray = new GenericComponent<Object>[components.Length + 1];
    components.CopyTo(newArray, 0);
    components = newArray;
    GenericComponent<Object> newComponent = new GenericComponent<Object>();//;(T)Activator.CreateInstance(typeof(T));
    newComponent.component = (T)Activator.CreateInstance(typeof(T));
    components[components.Length - 1] = newComponent;
    return (T)Activator.CreateInstance(typeof(T));
 }

【问题讨论】:

    标签: c# arrays generics types casting


    【解决方案1】:

    我不太明白你在这里尝试做什么,但是:

    public static object CreateInstance(Type type, params object[] args);
    

    args 是 ctor 参数。

    Activator.CreateInstance(typeof(Dog)); -> 这将调用public Dog(){} ctor。

    Activator.CreateInstance(typeof(Dog),"myString"); -> 这将调用public Dog(string name){} ctor。

    Activator.CreateInstance(typeof(T), new GenericComponent&lt;Object&gt; { }); -> 这将调用不存在public Dog(GenericComponent&lt;Object&gt; param){} ctor,因此您会得到异常

    编辑: 我试图理解为什么你做了你所做的但做不到。无论如何,看起来你想要这样的东西:

        public void Test()
        {
            MyClass myClass = new MyClass();
            Dog dog = myClass.AddGenericComponent<Dog>();
            dog.name = "Fluffy";
            MessageBox.Show(dog.name);
            //testing the accessor - ADD a NULL CHECK!!!
            dog = myClass.GetGenericComponent<Dog>();
            dog.name = "Fluffy mod";
            MessageBox.Show(dog.name);
        }
    
        public class MyClass
        {
            List<Object> objects = new List<Object>();
    
            public T AddGenericComponent<T>() where T : class, new()
            {
                T obj = GetGenericComponent<T>();
    
                if (obj == null)
                {
                    obj = new T();
                    objects.Add(obj);
                }
    
                return obj;
            }
    
            public T GetGenericComponent<T>() where T : class, new()
            {
                var relevantObj = objects.FirstOrDefault(o => o.GetType() == typeof(T));
                if (relevantObj != null)
                {
                    return relevantObj as T;
                }
    
                return null;
            }
        }
    
        public class Dog
        {
            public string name = "";
            public Dog() { }
            public Dog(string name)
            {
                this.name = name;
            }
    
        }
    

    【讨论】:

    • 我已经开始工作了,但还有一个问题,你知道我如何创建一个方法,类似于:“public T[] GetComponents() { return (T[ ])Array.FindAll(components, c => c.component.GetType() == typeof(T)); }"?我不断收到无法转换类型错误。
    【解决方案2】:

    我得到它与以下工作:

    class Test
    {
        public void TestStart()
        {
            MyClass myClass = new MyClass();
            Dog dog = myClass.AddGenericComponent<Dog>();
            dog.name = "Fluffy";
            Console.Writeline(dog.name);
            //testing the accessor
            dog = myClass.GetGenericComponent<Dog>();
            dog.name = "Fluffy mod";
            Console.Writeline(dog.name);
        }
    }
    [Serializable]
    public class GameObject
    {
        List<GenericComponent<Object>> componentList = new List<GenericComponent<Object>>();
    
        //returns first found in list.
        public T GetComponent<T>()
        {
            return (T)componentList.Find(c => c.component.GetType() == typeof(T)).component;
        }
        //add a component to component list.
        public T AddComponent<T>()
        {
            GenericComponent<Object> newComponent = new GenericComponent<Object>();
            newComponent.component = (T)Activator.CreateInstance(typeof(T));
            componentList.Add(newComponent);
            return (T)newComponent.component;
        }
        //returns all components of type T
        public List<T> GetComponents<T>()
        {
            List<T> r = new List<T>();
            for (int i = 0; i < componentList.Count; i++)
            {
                if (componentList[i].component.GetType() == typeof(T))
                {
                    r.Add((T)componentList[i].component);
                }
            }
            return r;
        }
    }
    [Serializable]
    public class GenericComponent<T> where T : new()
    {
        public T component;
        public GenericComponent()
        {
            component = new T();
        }
    }
    [Serializable]
    public class Dog
    {
        public string name = "";
        public Dog() { }
        public Dog(string name)
        {
            this.name = name;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 2017-03-12
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多