Tag: interface

使用通用接口约束时的协方差/逆差异难题

public interface IShape{} public class Rectangle : IShape{} public class Base{} public class Derived : Base{} public interface IFoo where T : IShape where U : Base { T Convert(U myType); } public class MyFoo : IFoo { public Rectangle Convert(Derived myType) { throw new NotImplementedException(); } } class Program { static void Main(string[] args) […]

System.TypeLoadException:方法’get_xxx’没有实现

关于这个问题,有很多问题浮出水面,我已经完成了他们的工作,没有任何乐趣。 我收到此错误: 程序集’App.Web,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null’类型’App.Web.WebConfig’中的方法’get_UserImageCDNUrl’没有实现。 这真的很奇怪,因为我试图运行没有引用App.Web的Api.Web,它们唯一的共同点是对其他项目的引用(Models.Domain和Models.DTO)。 我有一个界面: IResourceCompiler在程序集“Models.Domain”中 我有一个抽象类,它在名为WebConfigBase的同一个程序集(Models.Domain)中实现此接口 在“App.Web”和“Api.Web”项目中,它们每个都有一个名为WebConfig的类,它inheritance自WebConfigBase ,因此App和Api中的WebConfig类都是IResourceCompiler的实现。 我试图添加一个属性 string UserImageCDNUrl {get;} 到IResourceCompiler并将属性添加到WebConfigBase public string UserImageCDNUrl { get { return “”; } } 因此,通过自己的WebConfig类,Api和Web项目都可以访问该属性,并且我得到了上述例外。 我已经花了好几个小时试着看看为什么会发生这种情况并没有快乐。 我已经清除了我的Obj文件夹,清理,重建,检查了GAC中的任何实例(没有任何实例),我仍然坚持这一点。 一切正常,直到我尝试向接口(和基类)添加新属性

尝试使用C#中的新IFileDialog和IFileOpenDialog接口打开文件对话框,使用最少的代码

我正在尝试使用C#,Visual Studio 2010中的IFileOpenDialog接口显示可以选择文件夹的标准打开文件对话框。 我正在尝试使用最小的代码,所以我只在接口中定义了我需要的方法: using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // Disable warning CS0108: ‘x’ hides inherited member ‘y’. Use the new keyword if hiding was intended. \#pragma warning disable 0108 namespace FolderDialog { internal static class IIDGuid { internal const string IModalWindow = “b4db1657-70d7-485e-8e3e-6fcb5a5c1802”; internal const string IFileDialog = “42f85136-db7e-439c-85f1-e4075d135fc8”; internal const string IFileOpenDialog […]

C#调用非虚拟实现的接口方法

我是C#的新手,我不明白为什么编译器不会抱怨这段代码。 这是类的层次结构: interface IAble { void f(); } class AAble : IAble { public void f() { Debug.Log(“—->> A – Able”); } } class BAble : AAble { public void f() { Debug.Log(“—->> B – Able”); } } 执行代码: IAble i = new BAble(); if(); 执行—->> A – Able被打印出来。 为什么? 编译器如何知道应该调用哪个函数? 当决定调用什么函数 – 运行时或编译时? 如果我玷污一个新的class […]

我可以将成员定义/约束为实现两个接口,而不是generics吗?

以下代码显示了我想要做的事情; 也就是说,我想约束anObject,以便它可以用作各种方法的参数,使用IInterfaceOne或IInterfaceTwo,其中两者都不从另一个inheritance。 public interface IInterfaceOne { } public interface IInterfaceTwo { } public class Implementation : IInterfaceOne, IInterfaceTwo { } public interface IInterfaceOneAndTwo : IInterfaceOne, IInterfaceTwo { } public class UsingImplementation { IInterfaceOneAndTwo anObject = (IInterfaceOneAndTwo)(new Implementation()); //fails because Implementation doesnt acctually implement IInterfaceOneAndTwo } 但是这个例子失败了,因为IInterfaceOneAndTwo本身就是一个接口,而Implementation并没有实现它。 我知道如果我使用generics我可以约束它们,但我想知道,如果有一种方法可以做到这一点没有generics? 有没有办法说anObject应该实现IInterfaceOne和IInterfaceTwo ,而不使用IInterfaceOneAndTwo ?

C#中的抽象类和接口类有什么不同?

C#中的抽象类和接口类有什么不同?

DTO的接口

我目前正在开发一个大型Web应用程序,主要包含一个Angular SPA和一个可以访问后端层的OData WebAPI。 我们处于早期阶段并且已经开始实现第一个类,包括位于公共命名空间中的Model.dll ,以便所有层都可以访问它。 我们现在正在讨论模型中的那些DTO。 有人说使用接口是绝对必要的,所以代码是这样的: namespace MySolution.Common.Model { public interface IPerson { int Id { get; set; } string Name { get; set; } … } } namespace MySolution.Common.Model { public class PersonDTO : IPerson { public int Id { get; set; } public string Name { get; set; } … } } […]

如何序列化IList 等接口

可能重复: 如何序列化IList ? 我希望序列化一个类(我们称之为S ),它包含IList类型的属性,其中T是我定义的另一个类。 当我尝试将类S的实例序列化为XML时,我得到一个exception。 这是可以理解的,因为XmlSerializer不知道使用哪个具体类。 是否有一种方法,希望使用属性,指定在序列化/反序列化实例时要实例化的具体类。 我的类S实现创建了List类的实例。 这是一些代码来说明我的例子: using System; using System.Xml.Serialization; using System.IO; [Serializable] public class T { } [Serializable] public class S { public IList ListOfTs { get; set; } public S() { ListOfTs = new List(); } } public class Program { public void Main() { S s = new […]

在这种情况下,C#generics是否会阻止结构的自动装箱?

通常,将结构S视为接口I将触发结构的自动装箱,如果经常这样做会对性能产生影响。 但是,如果我使用类型参数T : I I编写一个generics方法并用S调用它,那么编译器是否会省略装箱,因为它知道类型S并且不必使用接口? 这段代码显示了我的观点: interface I{ void foo(); } struct S : I { public void foo() { /* do something */ } } class Y { void doFoo(I i){ i.foo(); } void doFooGeneric(T t) where T : I { t.foo(); // <— Will an S be boxed here?? } public static void […]

隐藏(使用“new”修饰符)接口方法声明的目的是什么?

可以将接口中的方法声明标记为“ new ”,但它是否具有任何“技术”意义,或者它只是一种明确声明声明不能覆盖前一个声明的方法? 例如 : interface II1 { new void F(); } interface II2 : II1 { new void F(); } 是有效的(C#4.0编译器不会抱怨)但似乎与以下内容不同: interface II1 { void F(); } interface II2 : II1 { void F(); } 提前感谢您提供任何信息。 编辑:你知道一个隐藏在界面中会有用的场景吗? 编辑:根据这个链接: 方法隐藏是一个好主意 (谢谢斯科特),最常见的情况似乎是协变返回类型的模拟。