静态类型混乱
本文关键字:混乱 类型 静态类 静态 | 更新日期: 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扩展方法也是如此。