2014-11-02 172 views
2

問題的新實例:如何創建泛型類型類

  1. 如何創建,設置,返回和實例類型「T」的對象?
  2. 我該如何訪問靜態函數中的子類類型(Tag:DataBASE)?

我想創建一個通用的「GetAsClass」函數,它將返回一個子類的初始化實例。我無法弄清楚如何創建我想返回的類的新實例並返回子類的類型。

說我有兩類:

  1. 標籤
  2. 用戶

我想創建的基類,它會得到它是什麼類型的單個功能。在另一方面,我想,使其靜態以及(但我沒有訪問「這個」,我不知道如何讓子類類型。

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

+0

我的代碼邏輯是否有意義?我試圖做甚至可能嗎? – 2014-11-02 04:07:35

+0

您應該將您的代碼作爲文本發佈,而不是圖像......標記(稱爲'markdown')能夠將您的問題的一部分作爲代碼,並執行語法突出顯示等。 – Steve 2014-11-02 04:10:48

+0

似乎難以閱讀我認爲這是一個截圖,但可以肯定的是,如果這能讓人們幫助我。現在如何幫助我的問題,而不是對語義的建設性批評。 – 2014-11-02 04:34:27

回答

3

您可以generic type constraints找到這個網頁是有益的 基本上,你會改變你的類的簽名/方法是:

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

它將接受類型T的就只我的它提供了一個沒有參數的默認構造函數。一旦這個條件得到保證,那麼你的班級可以調用new T()

+0

太棒了!這聽起來和我一直在尋找的一樣。一旦我完成了一些其他的代碼,我會給它一個鏡頭。 – 2014-11-02 06:10:23