C#:我可以扩展一个外部类,使它实现一个本地接口

时间:2017-10-04 19:07:48

标签: c# reflection .net-assembly

我有2个程序集(外部和本地)。外部装配不能修改。我想扩展一个外来类,以便它现在实现一个本地接口。这在C#中是否可行?

编辑: 我知道我可以做到以下几点:

// foreign.dll
namespace DX {
    public struct Vector3 {
        ...
    }
}

// local.dll
namespace MyDX {
    public static class Extensions {
        public static void MyExtensionMethod( this Vector3 vec, int index ){
            ...
        }
    }
}

我感兴趣的是强制外部类/结构实现特定接口(不使用继承)。我想将Vector3用作泛型类中的类型:

public class MyGeneric<T> where T: IComparable<T> {
    T _value;
}

上面的结构:Vector3没有实现IComparable,但是我想使用反射来实现接口,这样我就可以使用现有形式的外部类/结构(即w / o使用继承)。继承可能是必要的......

2 个答案:

答案 0 :(得分:9)

  

我可以扩展外部类,使其实现本地接口

当然,前提是外国人没有密封。 (当然,可以访问本地项目,等等。)

                    Brand br = new Brand();
                   {
                      br.ProductId = prod.ProductId;
                      br.BrandName = TxtBrandName.Text;
                      br.BrandDescription = TxtBrandDescription.Text;
                      br.DietType = TxtDietType.Text;
                    };

在那里,// Foreign.DLL namespace F { public class B { public void Foo() { } } } // Local.DLL interface IFooBar { void Foo(); void Bar(); } class D : F.B, IFooBar { public void Bar() { } } 已根据需要扩展DF.B根据需要实施D。请注意IFooBar如何符合F.B.Foo的合同义务,即使它在基类上。

如果外国人被密封,那么你必须使用作文而不是继承。

但是,我同意评论者说这闻起来像是一个XY问题。你能说出真正试图解决的问题更详细吗?因为可能有更好的方法来完成你想要的东西。

答案 1 :(得分:0)

从狭义上讲(如扩展方法),C#语言目前不支持扩展接口。但从更广泛的意义上讲,你可以使用@ Eric的答案中解释的继承或组合。

2015年在Roslyn issue 3357中简要讨论了在C#中支持扩展接口。但是,这不能仅由C#编译器完全实现,因为它需要CLR支持以确保(ITheAddedInterface)xx之间的引用相等。这个话题现在似乎已经放弃了。

其他CIL语言(如F#)具有比C#更灵活的扩展机制。但是C#正在迎头赶上,例如在C# language issue no. 164和视频A Preview of C# 8