我有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使用继承)。继承可能是必要的......
答案 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() { }
}
已根据需要扩展D
,F.B
根据需要实施D
。请注意IFooBar
如何符合F.B.Foo
的合同义务,即使它在基类上。
如果外国人被密封,那么你必须使用作文而不是继承。
但是,我同意评论者说这闻起来像是一个XY问题。你能说出真正试图解决的问题更详细吗?因为可能有更好的方法来完成你想要的东西。
答案 1 :(得分:0)
从狭义上讲(如扩展方法),C#语言目前不支持扩展接口。但从更广泛的意义上讲,你可以使用@ Eric的答案中解释的继承或组合。
2015年在Roslyn issue 3357中简要讨论了在C#中支持扩展接口。但是,这不能仅由C#编译器完全实现,因为它需要CLR支持以确保(ITheAddedInterface)x
和x
之间的引用相等。这个话题现在似乎已经放弃了。
其他CIL语言(如F#)具有比C#更灵活的扩展机制。但是C#正在迎头赶上,例如在C# language issue no. 164和视频A Preview of C# 8。