创建一个可以像XNamespace类那样实例化的类

本文关键字:XNamespace 实例化 一个 创建 | 更新日期: 2023-09-27 18:18:56

可以按如下方式创建XNamespace对象:

XNamespace ns="http://www.xyz.com";

这里字符串"http://www.xyz.com"被解释为该类的属性值(NamespaceName)。我想知道我是否可以创建这样一个自定义类,它可以像那样实例化。语法实际上看起来很酷。

创建一个可以像XNamespace类那样实例化的类

class MyClass
{
    public string Value {get; private set;}
    public MyClass(string s)
    {
        this.Value = s;
    }
    public static implicit operator MyClass(string s)
    {
        return new MyClass(s);
    }
}

现在你可以:

MyClass myClass = "my string";
Console.WriteLine(myClass.Value); //prints "my string"

注意,XNamespace还支持加法运算符,它接受字符串作为右参数。如果你在处理字符串,这是一个很好的API决策。要实现这一点,还可以重载加法运算符:

//XNamespace returns XName (an instance of another type)
//but you can change it as you would like
public static MyClass operator +(MyClass val, string name) 
{
    return new MyClass(val.Value + name);
}

您只需要添加一个隐式转换操作符,从string:

public class Foo
{
    private readonly string value;
    public Foo(string value)
    {
        this.value = value;
    }
    public static implicit operator Foo(string value)
    {
        return new Foo(value);
    }
}

我要小心地使用它——它使阅读代码时不那么明显。

(LINQ to XML在API设计方面做了各种"有点可疑"的事情…但它却成功地逃脱了惩罚,因为它非常完美地结合在了一起。