在C#中扩展现有结构以添加运算符

时间:2011-08-17 15:05:32

标签: c# .net struct operator-keyword

我想扩展.NET的内置Color结构,以添加+-等新运算符。
我将使用它们:

Color c1 = Color.FromName("Red");
Color c2 = Color.FromName("Blue");
Color result = c2 - c1;

有可能吗?如果有,怎么样?

7 个答案:

答案 0 :(得分:6)

使用内置运算符无法做到这一点。

你可以编写一种扩展方法来伪造它:

public static class Extensions
{
    public static Color Substract(this Color color, Color theOtherColor)
    {
        //perform magic here! 
        //be sure to return something or this won't compile
    }
}

Color c1 = Color.FromName("Red");
Color c2 = Color.FromName("Blue");
Color result = c2.Subtract(c1);

答案 1 :(得分:4)

正如其他人所说,你可以采用扩展方法或Decorator模式方式。

但是,考虑到Color具有相当数量的属性和方法,因此将它们从装饰器类重定向到包装的Color结构将意味着编写了大量的样板。但是,如果你走这条路线,你确实可以定义操作符甚至从类到颜色的隐式转换,反之亦然(这样你可以更加互换地使用它们),如下所示:

public class MyColor {
    public System.Drawing.Color val;

    public MyColor(System.Drawing.Color color)
    {
        this.val = color;
    }

    public static MyColor AliceBlue 
    {
        get {
            return new MyColor(System.Drawing.Color.AliceBlue);
        }
    }

    public override string ToString()
    {
        return val.ToString();
    }
    // .... and so on....

    // User-defined conversion from MyColor to Color
    public static implicit operator System.Drawing.Color(MyColor c)
    {
        return c.val;
    }
    //  User-defined conversion from Color to MyColor
    public static implicit operator MyColor(System.Drawing.Color c)
    {
        return new MyColor(c);
    }
}

进行测试:

MyColor c = System.Drawing.Color.AliceBlue; // assigning a Color to a MyColor
                                            // thanks to the implicit conversion
Console.WriteLine(c.ToString()); // writes "Color [AliceBlue]"

答案 2 :(得分:3)

C#中的Structs和Classes有很多相似之处,但是有几个不同之处在于你不能对struct进行子类化。您可以使用扩展方法来实现Add()或Subtract()方法,但不能在扩展方法中编写运算符重载。

如果我是你,我真的想扩展这样的现有结构的功能,我会将结构包装在我自己的类中。

答案 3 :(得分:1)

答案 4 :(得分:1)

这是一个古老的问题,但是由于它出现在我的DuckDuckGoSearch上,因此我认为应该予以回答。

可以使用C#进行此操作。现在您可以了。也许不是9年前被问到这一点时。

有关所需的所有信息,请参阅此文档: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/operator-overloading

在结构内部,它看起来像这样:

public static Fraction operator -(Fraction a, Fraction b)
        => a + (-b);

答案 5 :(得分:0)

我会说这些已经存在,你在谈论重新定义它们吗?这些是对颜色的alpha和RGB的操作。见下文:

http://msdn.microsoft.com/en-us/library/system.windows.media.color.op_subtraction.aspx

http://msdn.microsoft.com/en-us/library/system.windows.media.color.op_addition.aspx

答案 6 :(得分:0)

如果无法扩展某些内容,还可以创建包装类或结构。在许多情况下,组合实际上比扩展更强大和灵活。

它允许多重继承,您可以轻松升级/包装现有对象等。

我不是说这是这个问题的最佳答案,但肯定值得考虑。 :)