C# 有没有办法使现有类型实现接口?

C# 有没有办法使现有类型实现接口?,c#,interface,C#,Interface,假设我写了一个非常棒的界面。所以,非常棒,事实上,我想要一些我用来实现它们的内置类型,这样我编写的任何使用这个接口的代码都可以使用内置类型 public interface IKickAss { int Yeahhhhhhh() { get; } } public static class Woot { public int Bar(IKickAss a, IKickAss b) { return a.Yeahhhhhhh - b.Yeahhhhhhh;

假设我写了一个非常棒的界面。所以,非常棒,事实上,我想要一些我用来实现它们的内置类型,这样我编写的任何使用这个接口的代码都可以使用内置类型

public interface IKickAss
{
    int Yeahhhhhhh() { get; }
}

public static class Woot
{
    public int Bar(IKickAss a, IKickAss b)
    {
        return a.Yeahhhhhhh - b.Yeahhhhhhh;
    }
}

// What I'd like to do, sort of.
public partial struct Int32 : IKickAss
{
    public int Yeahhhhhhh
    {
        get
        {
            return this;
        }
    }
}
出于很多原因,我多次想要这个。最近的一个例子是,我为“uint”实现了基数排序,但也创建了一个简单的“IRadixSortable”接口,该接口需要属性“uint RadixKey{get}”。这意味着我基本上复制了排序代码:一个用于uint数组,另一个用于IRadixSortable数组。我宁愿通过使uint类型实现iradxsortable来编写一个。有没有办法做到这一点。。。也许使用反射

Haskell可以做到这一点(即类型类可以在任何时候在任何数据类型上实例化),我认为这是它如此强大的一个非常重要的原因。C#真的可以使用这个功能。可以称之为“扩展接口”:)

是和否


您可能正在寻找,请参见。

泛型如何?基本的数字类型都实现了ICopRable,因此您可以编写一个IComparer实现来传递给数组的排序方法


或者可能是一种扩展方法。

不使用接口,但可以使用扩展方法执行类似的操作。如果您控制可以从类继承的实例的创建并在新的继承器类中实现接口,您就不会得到“契约”

其他人已经回答了主要问题,但是关于特定的基数排序方案,您还可以查看.NET Framework中用于比较、哈希等的模式类型:允许基数排序方法的用户传入控制排序顺序的对象。例如,创建具有RadixKey属性的IRadixKeyProvider接口(类似于IHashCodeProvider或IComparer)


这并不理想,因为用户在每次对集合进行基数排序时都必须传入一个IRadixKeyProvider,而不是在集合类型上一次性定义基数键。(虽然您可能会通过为预定义类型创建一个排序方法重载来缓解这种情况,该方法在内部创建了相关的IRadixKeyProvider,然后转发给更通用的方法。)当然,它并不能解决更通用的场景(是的,我也想要类型类!)。但至少它可以避免重复基数排序代码。

我看不到内部类型的解决方案,但对于其他类型(即您或其他人创建的类型),您可以将其子类化并实现您选择的接口

public interface ISortable
{
    // ... whatever you need to make a class sortable
}

public class ExistingType
{
    // whatever
}

public class NewType : ExistingType, ISortable
{
    // ...
}

当然,除非您有权访问现有类型。。。然后让它实现你的接口。

特别让我恼火的是缺少像iAdable这样的接口,这对一般约束来说是天赐良机。没错!Haskell的类型类可以让你做各种整洁的事情。例如,“add3 x=x+3”是一个将3添加到任何“Num”类型的函数;这意味着,如果以后有人来创建自己的“Num”类型,此函数将完美地使用它。示例代码。从来没有。+1让我发笑!是啊!!使用运算符重载在KickAss方法上实现感叹号如何…这没有用,因为基数排序是非比较排序,所以使用IComparable没有多大帮助。而.net framework在其快速排序中使用比较器。感谢链接。我稍后会研究如何使用它来解决我的问题。