静态类型混乱

本文关键字:混乱 类型 静态类 静态 | 更新日期: 2023-09-27 17:49:42

静态类型不能用作类型参数

,

扩展方法应该在静态类

我有一个类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));
    }
}

那么处理这种情况的正确方法是什么呢?

我有我的类工作良好。我尝试添加克隆功能,发现扩展方法。这就是混乱开始的时候,我对扩展和实例方法不太熟悉。我正在努力使它工作

我的猜测是创建扩展作为一个方法,但我不知道如何做到这一点。

静态类型混乱

您需要考虑两件事:

第一:那个方法没有理由在那个类上。它不代表piece的任何功能,因为它是泛型的,可以返回任何类型。

第二:扩展方法应该在静态类上,是的,但不能在定义类型的同一个类上。它必须定义在静态类上,并且其他类可以通过引用该静态类命名空间来使用它。

所以你可能想要做的是这样的:

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();
        }
    }
}

如果该方法被显式地指定为只克隆piece类,则该方法只有在piece类上才有意义。在这种情况下,它根本不应该是一个扩展方法,而只是该类上的一个常规非静态方法。

如果需要piece类的扩展方法,只需将扩展方法扔到另一个类- PieceExtensions或诸如此类。即使在。net中,IEnumerable扩展方法也是如此。