标签: interface-implementation

您如何快速找到接口方法的实现?

有没有快速的方法来查找接口的方法/属性/等的所有实现,而不是引用?这是一些示例代码:

public class SomeClass : IBaseClass
{
  public Int32 GetInt()
  {
     return 1;
  }
}

public interface IBaseClass
{
  public Int32 GetInt();
}

public class SomeOtherClass
{
  IBaseClass _someClass;
  private TestMethod()
  {
    _someClass = new SomeClass();
    _someClass.GetInt();
  }
}
Run Code Online (Sandbox Code Playgroud)

我想在查看SomeOtherClass.TestMethod()时快速访问SomeClass.GetInt().如果我右键单击_someClass.GetInt()并单击"Go To Definition",它会将我带到界面.如果我单击"查找所有引用",我可能会看到所有用途的列表......而不仅仅是实现GetInt()方法的类.

有没有更快的方法来找到它?其他开发者的任何提示?我们正在使用DI来处理大多数依赖项,这意味着通过深层嵌套代码进行跟踪需要永远.

c# intellisense visual-studio interface-implementation

68
推荐指数
3
解决办法
4万
查看次数

所有数组在C#中实现了哪些接口?

作为一名新的.NET 3.5程序员,我开始学习LINQ,我发现了一些非常基本的东西,我之前没有注意到:

本书声称每个数组实现IEnumerable<T>(显然,否则我们不能使用LINQ到数组上的对象......).当我看到这个时,我心里想,我从未真正想过这个,我问自己所有数组实现了什么 - 所以我检查了 System.Array使用对象浏览器(因为它是CLR中每个数组的基类),并且我很惊讶,它没有实现IEnumerable<T>.

所以我的问题是:定义在哪里?我的意思是,我怎么能准确地告诉每个阵列实现哪些接口?

.net c# arrays interface-implementation

67
推荐指数
3
解决办法
3万
查看次数

允许实现多少个接口?

在C#中:

多少个接口,一个类可以实现在同一时间

public class MyClass: IInteferface_1, IInterface_2, ... , IInterface_N
{
}
Run Code Online (Sandbox Code Playgroud)

N有限制吗?

不要担心我不想实现或维护这样的对象.我只是想知道是否有限制.

.net c# interface interface-implementation

24
推荐指数
3
解决办法
2万
查看次数

C# 8.0 默认接口成员的意外行为

考虑以下代码:

interface I {
    string M1() => "I.M1";
    string M2() => "I.M2";
}

abstract class A : I {}

class C : A {
    public string M1() => "C.M1";
    public virtual string M2() => "C.M2";
}

class Program {
    static void Main() {
        I obj = new C();
        System.Console.WriteLine(obj.M1());
        System.Console.WriteLine(obj.M2());
    }
}
Run Code Online (Sandbox Code Playgroud)

它在 .NET Core 3.1.402 中产生以下意外输出:

I.M1
C.M2
Run Code Online (Sandbox Code Playgroud)

A没有 的成员的隐式或显式实现I,所以我希望默认实现用于C,因为C继承了 的接口映射A并且没有显式地重新实现I。根据 ECMA-334 (18.6.6) 和 C# 6.0 语言规范: …

c# interface-implementation c#-8.0 default-interface-member

20
推荐指数
1
解决办法
565
查看次数

接口实现两次"类型可以统一"; 为什么这个解决方法有效?

尝试为同一个类实现两次接口时遇到编译器错误,如下所示:

public class Mapper<T1, T2> : IMapper<T1, T2>, IMapper<T2, T1>
{
   /* implementation for IMapper<T1, T2> here.  */

   /* implementation for IMapper<T2, T1> here.  */
}
Run Code Online (Sandbox Code Playgroud)

错误:

'Mapper'无法同时实现'IMapper'和'IMapper',因为它们可能会统一某些类型参数替换.

为什么这个解决方法有效?我想知道我是否已经解决了问题或者只是欺骗了编译器.

public class Mapper<T1, T2> : MapperBase<T1, T2>, IMapper<T1, T2>
{
    /* implementation for IMapper<T1, T2> here. */
}

public class MapperBase<T1, T2> : IMapper<T2, T1>
{
    /* implementation for IMapper<T2, T1> here. */
}
Run Code Online (Sandbox Code Playgroud)

编辑:我已经更新MyClass,MyClassBase以及IMyInterfaceMapper,MapperBase以及IMapper代表一个更真实的场景,这个问题可以提出自己.

c# inheritance interface-implementation

19
推荐指数
1
解决办法
1013
查看次数

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

好吧,这是一个我要问的问题,而不是在展示良好的编码实践(这实际上可能被认为是一种不好的做法),而是在"可以"的问题上完成.

也就是说,在VB.NET中你实现了这样的接口......

Sub SomeInterfaceMember()
    Implements ISomeInterface.SomeInterfaceMember
End Sub
Run Code Online (Sandbox Code Playgroud)

而在C#中你明确地这样做(只能通过界面调用)......

void ISomeInterface.SomeInterfaceMember(){}
Run Code Online (Sandbox Code Playgroud)

或者更简单地,隐含地像这样(在这种情况下你可以直接调用它,或通过接口)......

void SomeInterfaceMember(){} // <-- This name matches the interface member
Run Code Online (Sandbox Code Playgroud)

但是,关于VB,您也可以使用您想要的任何名称来执行此操作...

Sub SomeRandomMemberName() // <-- This name doesn't match the interface member
    Implements ISomeInterface.SomeInterfaceMember
End Sub
Run Code Online (Sandbox Code Playgroud)

换句话说,处理实现的方法可以具有与接口的成员名称完全不同的名称.

我只是想知道在C#中是否有类似的东西.(是的,我知道我可以简单地做一个显式接口,然后通过另一个'wrapper'成员使用一个简单的委托给它的不同名称来访问它,但是在VB.NET中,你只需要一个方法.)

那可以做到吗?

标记

c# vb.net interface interface-implementation

13
推荐指数
1
解决办法
2497
查看次数

两个参数导致'类型中的方法没有实现'异常?

我有一个包含许多项目的解决方案.与此问题相关的是API类库,CustomTriggers类库和网站.CustomTriggers和网站都引用了API.CustomTriggers实现位于API中的Interface ITrigger.

问题是,如果我在接口ITrigger的'Run'方法中定义了一个参数可以正常工作,但是如果我定义了两个参数,那么来自程序集*的Type'CustomTriggers.*'中的"方法'运行'没有实现'抛出异常.我不明白为什么.

界面:

namespace projectbase{
public interface ITrigger {
    string EntityTypeName { get; set; }
    int EntityID { get; set; }
    API.API.TriggerEventType TriggerEventType { get; set; }
    void Run(KeyValuePair<string, object>[] parameters);
}  }
Run Code Online (Sandbox Code Playgroud)

实现ITrigger的'CustomTriggers'项目中的类:

public class SomeTrigger : projectbase.ITrigger {
    public string EntityTypeName { get; set; }
    public int EntityID { get; set; }
    public API.API.TriggerEventType TriggerEventType { get; set; }
    public void Run(KeyValuePair<string, object>[] parameters) {
    }
}
Run Code Online (Sandbox Code Playgroud)

[不]抛出异常的方法[stub]:

string file = @"dir\CustomTriggers.dll";
string assemblyname = AssemblyName.GetAssemblyName(file).ToString();
Assembly …
Run Code Online (Sandbox Code Playgroud)

c# reflection interface-implementation

13
推荐指数
0
解决办法
2万
查看次数

在MVC4中显示和错误,我必须实现一些接口,但我已经完成了它

我正在尝试创建自己的过滤器属性,以支持多语言.这个想法很简单.URL代表语言.

  • *HTTP://host.ext/ EN/rest_of_the_url*将用英语开
  • *http://host.ext/ hy/rest_of_the_url*将以亚美尼亚语开放.

问题是在运行时它会说MultilingualActionFilterAttribute

以下是错误文本"给定的过滤器实例必须实现以下一个或多个过滤器接口:IAuthorizationFilter,IActionFilter,IResultFilter,IExceptionFilter".

在这里,我将它用作全局过滤器.

namespace TIKSN.STOZE.WebApp
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(System.Web.Mvc.GlobalFilterCollection filters)
        {
            filters.Add(new TIKSN.STOZE.Common.MultilingualActionFilterAttribute());
            filters.Add(new System.Web.Mvc.HandleErrorAttribute());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这里定义它.

namespace TIKSN.STOZE.Common
{
    public class MultilingualActionFilterAttribute : System.Web.Mvc.ActionFilterAttribute
    {
        public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
        {
            string language = System.Convert.ToString(filterContext.RouteData.Values["language"]);

            System.Diagnostics.Debug.Print("Requested language is '{0}'", language);
            language = Helper.PickUpSupportedLanguage(language);
            System.Diagnostics.Debug.Print("Supported language is '{0}'", language);

            if (language == string.Empty)
            {
                filterContext.HttpContext.Response.RedirectToRoutePermanent(new { language = Common.Properties.Settings.Default.DefaultLanguageCode });
            }

            language = Helper.TryToPickUpSupportedLanguage(language);

            System.Threading.Thread.CurrentThread.CurrentCulture = …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc multilingual inheritance interface-implementation

11
推荐指数
2
解决办法
8229
查看次数

重写继承方法时避免使用显式类型转换

我有一个基本抽象类,也实现了一个特定的接口.

public interface IMovable<TEntity, T>
    where TEntity: class
    where T: struct
{
    TEntity Move(IMover<T> moverProvider);
}

public abstract class Animal : IMovable<Animal, int>
{
    ...

    public virtual Animal Move(IMover<int> moverProvider)
    {
        // performs movement using provided mover
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我继承了一些类,其中一些必须覆盖基类的接口实现方法.

public class Snake : Animal
{
    ...

    public override Animal Move(IMover<int> moverProvider)
    {
        // perform different movement
    }
}
Run Code Online (Sandbox Code Playgroud)

我的接口方法在移动后返回相同的对象实例,因此我可以使用链接或直接在return语句中执行某些操作而不使用其他变量.

// I don't want this if methods would be void typed
var s = GetMySnake();
s.Move(provider); …
Run Code Online (Sandbox Code Playgroud)

c# generics inheritance interface-implementation

11
推荐指数
1
解决办法
1048
查看次数

使用Java 8在运行时选择具体实现

我不清楚在选择要实例化的实现/子类时放置if/的位置switch,特别是考虑到现在接口可以有静态方法.

假设我有一个服务,一个由接口和几个实现定义的类型.我想最好不要把这个逻辑放在服务中,而是要有工厂方法.但是它应该在界面中还是在另一个类中使用此答案中建议的param-to-type映射?

把它放在界面中似乎很自然:

public interface MyInterface
{
    public void doSomething();

    public static MyInterface create(int param)
    {
        if (param == 0)
            return new ImplA();
        else
            return new ImplB();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后只需从服务中调用它:

public class MyService
{
    public void serveMe(int param)
    {
        MyInterface.create(param).doSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我不知道接口是否知道它的实现,或者父类知道它的子类型是不是很糟糕.所以

  1. 我应该把这个逻辑放在哪里?
  2. 如果我选择一个类型的子类,那会改变很多吗?

java inheritance interface-implementation

11
推荐指数
1
解决办法
2467
查看次数