繁体   English   中英

如何为类型创建扩展方法

[英]How to create extension methods for Types

我正在编写一个扩展方法来解析任何给定类型的 JSON 字符串。 我想在类型上使用该方法,而不是像我们已经知道的许多示例那样使用实例,但我觉得 Visual Studio 不支持它。 有人可以在这里启发我吗? 以下是方法:

public static T ParseJson<T>(this T t, string str) where T: Type
{
    if (string.IsNullOrEmpty(str)) return null;
    var serializer = new JavaScriptSerializer();
    var obj = serializer.Deserialize<T>(str);
    return obj;
}

我想以这种方式调用该方法:

var instance = MyClass.ParseJson(text);

谢谢

简短的回答是无法做到。 扩展方法需要在某事的实例上工作。

要使用扩展方法,您必须执行以下操作:

var instance = typeof(MyClass).ParseJson(text);

标记“MyClass”不是类型 instamce intself,但使用 typeof 会给你一个类型来操作。 但这有什么比:

var instance = JsonUtility.ParseJson<MyClass>(text);

编辑:实际上,扩展方法的代码仍然不会做你想要的。 它总是会返回一个“类型”对象,而不是该类型的实例。

您不能创建适用于类型本身的扩展方法。 它们只能在类型的实例上调用。

正如接受的答案中所述,您不能。 但是,如果您有一个可以从 T 实例调用的扩展方法:

public static T ParseJson<T>(this T t, string s)

你可以写一个这样的实用方法:

public static T ParseJson<T>(string s)
    where T: new()
    => new(T).ParseJson(s);

并这样称呼它:

var t = Utilities.ParseJson<T>(s);

恐怕这是你能做的最好的...

您可以创建和扩展方法

public static class MyExtensions
{
    public static string Serialize<T>(this T self)
    {
        return JsonSerializer.Serialize(self);
    }
}

并像使用它一样

instance.Serialize();

您不必像instance.Serialize<Type>();那样使用它因为大多数时候(如果不是所有时间)它可以从使用中推断出来。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM