如何创建通用类型类的新实例

时间:2014-11-02 03:16:32

标签: c# algorithm generics parse-platform abstract-class

问题:

  1. 如何创建,设置和返回并实例化类型对象" T"?
  2. 如何在静态函数中访问子类类型(Tag:DataBASE)?
  3. 我试图创建一个通用" GetAsClass"函数,它将返回子类的初始化实例。我无法弄清楚如何创建我想要返回的类的新实例并返回子类类型。

    说我有两个班级:

    1. 标签
    2. 用户
    3. 我想在基类中创建一个单独的函数,它将获得它的任何类型。另一方面,我也希望将其设置为静态(但是我无法访问"这个"我不知道如何获得子类型

          private async Task<T> GetAsClass<T>(string objectId) {
      
              Type classType = this.GetType();
              string className = classType.Name; 
      
              // This needs to be of type "T" (Tag myTag = new Tag();) How would I accomplish something like this?
              object toReturnObject = new object();
              ParseObject myParseObject = ParseObject.GetAsParseObject(objectId);
      
              foreach (PropertyInfo field in classType.GetRuntimeProperties()) {
                  if (field.CanRead) {
                      string propertyName = StringHelper.ToLowerCamelCase(field.Name);
                      if (field.PropertyType == typeof(string)) {
                          string propertyValue = myParseObject.Get<string>(propertyName);
                          field.SetValue(toReturnObject , propertyValue);
                      }
                      if (field.PropertyType == typeof(int)) {
                          int propertyValue = myParseObject.Get<int>(propertyName);
                          field.SetValue(toReturnObject, propertyValue);
                      }
                  }
              }
      
              return toReturnObject;
          }
      

      Code so far 更高分辨率:http://snag.gy/FbCfu.jpg

1 个答案:

答案 0 :(得分:3)

您可以在generic type constraints上找到此页面以获得帮助。 基本上,您可以将类/方法的签名更改为:

private async Task<T> GetAsClass<T>(string objectId)
    where T: new()
{
    ...
}

只有当它提供没有参数的默认构造函数时,它才会接受T的类型。一旦该条件得到保证,您的班级就可以调用new T()