2015-05-19 74 views
-2

Static Type cant be used as type arguments靜態類型混亂

Extension Method should be in a Static class

我有一個類piece,所以我可以在我的代碼

現在創建List<piece>,當我嘗試創建一個擴展,並問我創建類爲靜態。但如果我這樣做,不能創建List<piece>。所以我在這裏處於遞歸困境。

正如你所看到的,我試圖克隆我的作品。

public class piece 
{ 
    public int height { get; set; } 
    public int width { get; set; } 
    public int[] shape { get; set; } 
    public int quality { get; set; } 
    public int x { get; set; } 
    public int y { get; set; } 

    public static T CloneJson<T>(this T source) 
    { 
     // Don't serialize a null object, simply return the default for that object 
     if (Object.ReferenceEquals(source, null)) 
     { 
      return default(T); 
     } 

     return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source)); 
    } 
} 

那麼,處理這種情況的正確方法是什麼?

我有我的課程正常工作。我嘗試添加克隆功能並找到該擴展方法。那就是當混亂開始的時候,是的,我不太熟悉擴展或實例方法。我試圖讓它工作

我的猜測是創建擴展作爲一種方法,但我不知道該怎麼做。

+7

爲什麼'piece'類中的這個方法開始?它與這種類型無關。 – Servy

+2

你在做什麼是沒有意義的。如果你想要一個像你想創建的'擴展方法'一樣的方法,添加一個* instance *方法。如果你真的想要一個通用的擴展方法,把它放在另一個靜態類 - 它與這個沒有任何關係。 –

+3

創建一個不同的類,使其成爲靜態的,將您的擴展方法放在那裏。 – juharr

回答

1

兩件事情要考慮:

第一:這個方法有沒有理由在這個類。它不代表任何功能的片斷,因爲它是通用的,可以返回任何類型。

第二:擴展方法應該在靜態類上,是的,但不是在定義類型的同一類上。它必須在靜態類上定義,並由其他類通過引用該靜態類名稱空間而被使用。

所以,你可能想要做的是這樣的:

namespace MyApp.MyExtensions 
{ 
    public static class CloneExtensions 
    { 
     public static T CloneJson<T>(this T source) 
     { 
      if (Object.ReferenceEquals(source, null)) 
       return default(T); 

      return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source)); 
     } 
    } 
} 

那麼你可以使用

namespace MyApp 
{ 
    using MyApp.Extensions; 

    public class TestClass 
    { 
     public TestClass() 
     { 
      var item = new piece(); 
      var clone = piece.CloneJson(); 
     } 
    } 
} 

這種方法只會使意義上的一塊類,如果它是明確鍵入僅克隆該片段類。在這種情況下,它不應該是一個擴展方法,而只是一個常規的非靜態方法。

+0

謝謝,這是有道理的。我剛剛看到了這個例子,並嘗試將該擴展複製爲類的一部分。 –

0

如果您需要piece類的擴展方法,只需將擴展方法放入另一個類 - PieceExtensions等。這甚至在.NET中爲IEnumerable Extension Methods完成。你需要