有没有快速的方法来查找接口的方法/属性/等的所有实现,而不是引用?这是一些示例代码:
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来处理大多数依赖项,这意味着通过深层嵌套代码进行跟踪需要永远.
作为一名新的.NET 3.5程序员,我开始学习LINQ,我发现了一些非常基本的东西,我之前没有注意到:
本书声称每个数组实现IEnumerable<T>(显然,否则我们不能使用LINQ到数组上的对象......).当我看到这个时,我心里想,我从未真正想过这个,我问自己所有数组实现了什么 - 所以我检查了
System.Array使用对象浏览器(因为它是CLR中每个数组的基类),并且我很惊讶,它没有实现IEnumerable<T>.
所以我的问题是:定义在哪里?我的意思是,我怎么能准确地告诉每个阵列实现哪些接口?
在C#中:
多少个接口,一个类可以实现在同一时间?
public class MyClass: IInteferface_1, IInterface_2, ... , IInterface_N
{
}
Run Code Online (Sandbox Code Playgroud)
N有限制吗?
不要担心我不想实现或维护这样的对象.我只是想知道是否有限制.
考虑以下代码:
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 语言规范: …
尝试为同一个类实现两次接口时遇到编译器错误,如下所示:
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以及IMyInterface向Mapper,MapperBase以及IMapper代表一个更真实的场景,这个问题可以提出自己.
好吧,这是一个我要问的问题,而不是在展示良好的编码实践(这实际上可能被认为是一种不好的做法),而是在"可以"的问题上完成.
也就是说,在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中,你只需要一个方法.)
那可以做到吗?
标记
我有一个包含许多项目的解决方案.与此问题相关的是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) 我正在尝试创建自己的过滤器属性,以支持多语言.这个想法很简单.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
我有一个基本抽象类,也实现了一个特定的接口.
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) 我不清楚在选择要实例化的实现/子类时放置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)
但是我不知道接口是否知道它的实现,或者父类知道它的子类型是不是很糟糕.所以
c# ×9
inheritance ×4
.net ×2
interface ×2
arrays ×1
asp.net-mvc ×1
c#-8.0 ×1
generics ×1
intellisense ×1
java ×1
multilingual ×1
reflection ×1
vb.net ×1