Tag: 接口

IsAssignableFrom还是AS?

我有下一个代码: private T CreateInstance(object obj) // where T : ISomeInterface, class { … if (!typeof(T).IsAssignableFrom(obj.GetType())) { throw ..; } return (T)obj; } 它可以替换为: T result = obj as T; if (result == null) { throw ..; } return result; 如果不是 – 为什么?

更改为通用接口的性能影响

我研究使用Visual Studio在C#/ .NET中开发的应用程序。 在我的方法的原型中,ReSharper经常建议我用更通用的参数替换输入参数的类型。 例如,List with IEnumerable 如果我只在我的方法体中使用带有foreach的列表。 我可以理解为什么它写起来更聪明,但我非常关心性能。 如果我听ReSharper的话,我担心我的应用程序的性能会降低… 当我写作时,有人能够(或多或少)向我解释幕后发生的事情(即在CLR中): public void myMethod(IEnumerable list) { foreach (string s in list) { Console.WriteLine(s); } } static void Main() { List list = new List(new string[] {“a”, “b”, “c”}); myMethod(list); } 和有什么区别: public void myMethod(List list) { foreach (string s in list) { Console.WriteLine(s); } } […]

创建一个在c#中实现多个接口的抽象类

我想在c#中创建一个抽象类,它从不同的接口“inheritance”,但是将具体的实现留给了子类。 然而,编译器抱怨说,该类没有实现接口中指定的方法。 我已经习惯了Java总是有效的,所以我不确定它应该如何在c#中工作。 无论如何,这是我的代码: public abstract class MyClass : IDisposable, IPartImportsSatisfiedNotification { private string name; public MyClass(string name) { this.name = name; } }

System.Data.IDbCommand和异步执行?

System.Data.SqlClient.SqlCommand有方法 BeginExecuteNonQuery BeginExecuteReader BeginExecuteXmlReader 和 EndExecuteNonQuery EndExecuteReader EndExecuteXmlReader 用于异步执行。 System.Data.IDbCommand只有 ExecuteNonQuery ExecuteReader ExecuteXmlReader 这些仅用于同步操作。 是否存在异步操作的接口? 另外,为什么没有BeginExecuteScalar?

C#接口实现关系只是“可以做”的关系?

今天有人告诉我,C#中的接口实现只是“Can-Do”关系,而不是“Is-A”关系。 这与我长期相信LSP(Liskov Substitution Principle)相冲突。 我一直认为所有的inheritance应该意味着“Is-A”的关系。 所以,如果接口实现只是一个“可以做”的关系。 如果有一个界面“IHuman”和“IEngineer”,并且一个类“Programmer”inheritance自“IHuman”和“IEngineer”怎么办? 当然,“程序员”是“IHuman”和“IEngineer”。 如果它只是“Can-Do”关系,是否意味着我们不能指望“程序员”实例行为在被视为IHuman并被视为IEngineer时可能会有所不同?

是否有像ICollection 这样的界面,但是是为有序集合设计的?

…或者我可以使用ICollection没有问题吗? 我的意思是,我不认为ICollection是为Sorted集合设计的,因为这可能会破坏为排序或未插入的ICollection对象设计的应用程序,但我不知道。

如何在界面中表示枚举

好的,所以这篇文章的基础和解释标题很简单。 我有一个方法的接口。 用户端的该方法将枚举作为参数。 但是你不能在界面中定义枚举因此我不知道如何定义这个方法然后如果我期待一个类型枚举作为传入参数之一。 那你怎么处理这种情况呢? 你怎么能在你的界面中获得该方法。 你不知道他们需要发送什么Enum但是你肯定知道你想要它是一个enum而不是魔术字符串。 枚举不是引用类型,因此您不能将Object用作传入参数的类型。 所以不知道该怎么做。

将接口作为参数传递给扩展方法

我已经使用扩展方法来扩展html助手来制作RSS转发器: public static string RSSRepeater(this HtmlHelper html, IEnumerable rss) { string result=””; foreach (IRSSable item in rss) { result += “” + item.GetRSSItem().InnerXml + “”; } return result; } 所以我让我的一个业务对象实现IRSSable,并尝试将其传递给HTML帮助器。 但我似乎无法使它工作,我尝试过: <%=Html.RSSRepeater(ViewData.Model.GetIssues(null, null, "") as IEnumerable) %> 编译正常,但传递null Intellisense抱怨无法将IEnumerable问题传递给IEnumberable IRSSable 你是怎么做到的? 我正在调用的那个方法IEnumberable返回IEnumberable并且问题肯定会实现IRSSAble

传递引用类型对象并更改值

我试图将引用类型对象传递给方法并从那里更改它。 当我更改它时,我没有对传递给方法的变量进行更改。 这是一个例子: public interface IPerson { string Name { get; } } public class Teacher : IPerson { public string Name { get; set; } public string LastName { get; set; } } //…… public void CreateTeacher(IPerson teacher) { teacher = new Teacher() { Name = “Teacher name”, LastName = “Teacher’s last name”}; } […]

C#inheritance

假设我有以下代码: interface ISomeInterface { void DoSomething(); void A(); void B(); } public abstract class ASomeAbstractImpl : ISomeInterface { public abstract void A(); public abstract void B(); public void DoSomething() { // code here } } public class SomeImpl : ASomeAbstractImpl { public override void A() { // code } public override void B() { // […]