2015-05-19 76 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完成。你需要