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

时间:2013-06-19 08:22:28

标签: c# .net instantiation

可以创建XNamespace对象,如下所示:

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

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

2 个答案:

答案 0 :(得分:5)

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也支持addition operator,它接受​​字符串作为右参数。如果您正在处理字符串,这是一个非常好的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);
}

答案 1 :(得分:3)

您只需要在字符串中添加implicit conversion operator

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设计方面做了各种“有点可疑”的事情......但是设法摆脱它因为它们整齐地融合在一起。)