Tag: 接口

传递接口集合

假设您有以下课程: class Car : IPainting { … } 然后像这样的函数: void AddCars(IEnumerable collection) 然后像这样的代码片段: Car bmw = new Car(); Car mercedes = new Car(); IPainting a = (IPainting) bmw; IPainting b = (IPainting) mercedes; IPainting[] paintings = new IPainting[] {a, b}; AddCars(paintings); // fails to compile 这当然不能编译,因为AddCars()方法只接受Cars的集合,但它是’painting’数组的组成部分。 我知道C#4.0可能会为此提供解决方案。 今天有没有解决方法呢? 谢谢, 阿尔贝托

实现接口隐式和显式是否有意义?

我正在攻读MS 70-515考试。 在其中一个实践中,作者实现了隐式和显式的接口。 显式实现只调用隐式实现。 刚才列出了显式实现而没有解释。 同时拥有接口的隐式和显式实现是否有意义? 我认为显式实现是多余的(在这种情况下)。 public class PassTextBox : TextBox, IScriptControl { public virtual IEnumerable GetScriptDescriptors() { var descriptor = new ScriptControlDescriptor( “AjaxEnabled.PassTextBox”, ClientID); // … return new ScriptDescriptor[] {descriptor}; } IEnumerable IScriptControl.GetScriptDescriptors() { return GetScriptDescriptors(); } } 顺便说一下,代码似乎在没有显式实现的情况下运行得很好,因为隐式实现是公开的。 它涉及MCTS Self-Paced Training Kit(考试70-515):使用Microsoft .NET Framework进行Web应用程序开发4第9章,第2课,练习3。

接口列表与派生类型列表 – 无法将表达式类型转换为返回类型

为什么这样做: public IList GetCouponsForSite(string siteSlug) { var coupons = _db.Coupons.Where(x => x.Site.slug == siteSlug) .Select(x => new Coupon(x.id)); var list = new List(); foreach (var coupon in coupons) { list.Add(coupon); } return list; } 但这确实不起作用(错误 – 无法将表达式转换为返回类型): public IList GetCouponsForSite(string siteSlug) { return _db.Coupons.Where(x => x.Site.slug == siteSlug) .Select(x => new Coupon(x.id)).ToList(); }

inheritance自具有相同方法签名的多个接口的类

说,我有三个接口: public interface I1 { void XYZ(); } public interface I2 { void XYZ(); } public interface I3 { void XYZ(); } inheritance自这三个接口的类: class ABC: I1,I2, I3 { // method definitions } 问题: 如果我这样实现: ABC类:I1,I2,I3 { public void XYZ() { MessageBox.Show(“WOW”); } } 它编译得很好,也运行得很好! 这是否意味着这个单一方法实现足以inheritance所有三个接口? 如何实现所有三个接口的方法并调用它们 ? 像这样的东西: ABC abc = new ABC(); abc.XYZ(); // […]

接口的隐式和显式实现

在进行升级时,碰巧碰到了这样的代码。 interface ICustomization { IMMColumnsDefinition GetColumnsDefinition(); } class Customization : ICustomization { private readonly ColumnDefinition _columnDefinition; //More code here. public ColumnsDefinition GetColumnsDefinition() { return _columnDefinition; } ColumnsDefinition ICustomization.GetColumnsDefinition() //redundant { return GetColumnsDefinition(); } } 我的问题是:在这段代码中是否需要/使用“显式”接口实现? 如果我删除上面标记为“冗余”的方法(显式实现接口)会不会产生任何问题? PS:我理解接口的显式实现非常重要,当我们需要仅在接口级别访问方法时,可以使用它,并使用具有相同签名方法的两个接口。

从接口强制执行可序列化而不强制类在C#中自定义序列化

我有一个接口,定义了一些我希望某些类实现的方法。 公共接口IMyInterface { 治法; 方法b; } 另外,我希望实现此接口的所有类都可以序列化。 如果我更改接口定义以实现ISerializable如下…: 公共接口IMyInterface:ISerializable { 治法; 方法b; } …据我所知,所有类现在必须显式实现序列化,因为如果实现ISerializable,则必须实现GetObjectData成员(以及反序列化所需的构造函数)。 如何坚持使用我的界面的类是可序列化的,但不强制他们自定义实现序列化? 谢谢,威尔

在C#中,是否可以使用具有不同名称的成员实现接口成员,就像在VB.NET中一样?

好吧,这是一个我要问的问题,而不是在展示良好的编码实践(这实际上可能被认为是一种不好的做法),而是在“可以”的问题上完成。 也就是说,在VB.NET中你实现了这样的接口…… Sub SomeInterfaceMember() Implements ISomeInterface.SomeInterfaceMember End Sub 而在C#中你明确地这样做(只能通过界面调用)…… void ISomeInterface.SomeInterfaceMember(){} 或者更简单地,隐式地像这样(在这种情况下你可以直接调用它,或通过接口)…… void SomeInterfaceMember(){} // <– This name matches the interface member 但是,关于VB,您也可以使用您想要的任何名称来执行此操作… Sub SomeRandomMemberName() // <– This name doesn't match the interface member Implements ISomeInterface.SomeInterfaceMember End Sub 换句话说,处理实现的方法可以具有与接口的成员名称完全不同的名称。 我只是想知道在C#中是否有类似的东西。 (是的,我知道我可以简单地做一个显式接口,然后通过另一个’wrapper’成员使用一个简单的委托给它的不同名称来访问它,但是在VB.NET中,你只需要一个方法。) 那可以吗? 标记

当基本单词以I开头时,如何命名界面?

我想为“Items”创建一个界面。 Typicaly我会通过在基本单词中添加“I”前缀来命名接口。 但在这种情况下,我的基本单词已经以I开头。这里有几个想法 IItem :两个我 Iitem :改变这种情况 ItemInterface :跳过I前缀并写出Interface 什么看起来最好? 有没有其他人遇到这个问题。 如果是这样你做了什么?

将派生类明确标记为实现基类的接口

interface IBase { string Name { get; } } class Base : IBase { public Base() => this.Name = “Base”; public string Name { get; } } class Derived : Base//, IBase { public Derived() => this.Name = “Derived”; public new string Name { get; } } class Program { static void Main(string[] args) { […]

从加载的程序集中查找实现接口的对象 – 如何比较类型?

我有一个类将加载目录中的所有程序集,然后获取所有类型,看看它们是否实现了一个接口。 我无法进行类型比较。 在调试器中,如果总是未通过比较,我会看到我的类型已加载(我感兴趣的那个)。 如果我在本地使用相同的比较代码,我没有问题,我得到了预期的结果。 我可以在类型接口上进行sting比较,但我更愿意知道我做错了什么。 测试: // Fails [Fact] public void FindISerialPortTest() { var path = Directory.GetCurrentDirectory(); var results = FindImplementers.GetInterfaceImplementor(path); results.Length.Should().Be(1); results[0].Should().BeAssignableTo(); } //Passes [Fact] public void DoesTypeImplementInterfaceTest() { var myType = typeof(SerialPortWrapper); var myInterface = typeof(ISerialPort); FindImplementers.DoesTypeImplementInterface(myType, myInterface).Should().Be(true); } class级: public class FindImplementers { public static T[] GetInterfaceImplementor(string directory) { if (String.IsNullOrEmpty(directory)) { […]