假如有以下代码:
class Json
{
}
class Program
{
static void Main(string[] args)
{
}
Json MyAction()
{
return "{\"json\": 1}";
}
}
有什么东西我可以添加到Json
类中,使其编译通过吗?有什么方法可以让编译器知道它可以将字符串隐式转换为Json吗?
假如有以下代码:
class Json
{
}
class Program
{
static void Main(string[] args)
{
}
Json MyAction()
{
return "{\"json\": 1}";
}
}
有什么东西我可以添加到Json
类中,使其编译通过吗?有什么方法可以让编译器知道它可以将字符串隐式转换为Json吗?
C#中的implicit
操作符声明允许你指定:
{type to convert to} ({type to convert from} variablename)
这是一个简单的例子:
class Json
{
private Json(string json)
{
//logic to parse string into object
}
public static implicit operator Json(string input)
{
return new Json(input);
}
}
一些笔记:
首先,我不会必然采用这种方法,因为您应用程序中的大多数字符串与JSON字符串在语义上并不等效。转换运算符的目的是说两种类型始终表示语义上等效的信息(或足够接近以便有用地被视为这样)。我建议在您的Json类上实现static Json Parse(string input)
甚至可能是static bool TryParse(string input, out Json json)
方法。通常,调用方应该知道它是否期望自己的字符串包含Json。
通常,如果我的类从类型提供隐式类型转换,我发现最好使任何解析或ctor逻辑针对相同类型private
。这确保了消费者只有一种方法来执行特定的操作,而不是两种方法(ctor和conversion)- 因此在上面的示例中使用了私有构造函数。这可能会有例外,但对我来说这是一个很好的一般规则。
隐式转换还允许某些有趣的比较运算符。例如,现在您可以从字符串隐式转换为json,您还可以执行以下操作:if(myJson == "blah")
,它将进行转换,然后在您的Json对象上调用 ==
运算符,默认情况下会执行引用相等性比较。
添加一个隐式操作符:
public static implicit operator Json(string s)
{
return new Json(s);
}
implicit关键字用于声明一个隐式的用户定义类型转换运算符。使用它来在用户定义类型和另一种类型之间启用隐式转换,如果该转换保证不会导致数据丢失。
.ToJson()
扩展方法,而不是重载implicit
操作符,因为这种隐式转换违反了一些重要的指南(请参见Saeed的答案)。特别是它可能会抛出异常,在比较中语义奇怪并且不是无损的。 - CodesInChaos