汎用抽象クラスのインスタンスであり、特定のインターフェイスを実装するすべてのクラスをアセンブリ内で見つける方法を教えてください。汎用抽象クラスのインスタンスであり、特定のインターフェイスを実装するアセンブリ内のすべてのクラスを見つける方法
注:
インターフェイスは、インターフェイスを実装する別のクラスから継承されたクラスで実装することもできます。
具体的な例:
私は怒鳴るインタフェースとミドルウェアクラスを持っている:
public interface IHttpHandler
{
bool IsReusable { get; }
void ProcessRequest(HttpContext context);
}
public abstract class HandlerMiddleware<T> where T: IHttpHandler
{
private readonly RequestDelegate _next;
public HandlerMiddleware()
{ }
public HandlerMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
await SyncInvoke(context);
}
public Task SyncInvoke(HttpContext context)
{
// IHttpHandler handler = (IHttpHandler)this;
T handler = System.Activator.CreateInstance<T>();
handler.ProcessRequest(context);
return Task.CompletedTask;
}
} // End Abstract Class HandlerMiddleware
は、どのように私は、抽象クラスを実装HelloWorldHandlerなどのすべてのクラスは、検索、およびIHTTPハンドラを実装することができます。
HandlerMiddlewareは汎用であることに注意してください。
すべてのハンドラが見つかります。 HelloWorldHandler1とHelloWorldHandler2です。
[HandlerPath("/hello")]
public class HelloWorldHandler
: HandlerMiddleware<HelloWorldHandler>, IHttpHandler
{
public HelloWorldHandler() :base() { }
public HelloWorldHandler(RequestDelegate next):base(next) { }
void IHttpHandler.ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
//await context.Response.WriteAsync("Hello World!");
byte[] buffer = System.Text.Encoding.UTF8.GetBytes("hello world");
context.Response.Body.Write(buffer, 0, buffer.Length);
}
bool IHttpHandler.IsReusable
{
get
{
return false;
}
}
}
ボーナスポイント方法は、また、この構造物を見つけた場合:かどうかを確認するには
List<Type> result = new List<Type>();
var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();
foreach(var assem in assemblies)
{
var list = assem.GetExportedTypes().Where(t => t.GetInterfaces().Contains(typeof(IHttpHandler))).ToList();
if (list != null && list.Count != 0)
{
result.AddRange(list);
}
}
:
[HandlerPath("/hello2")]
public class HelloWorldHandler2
: HandlerMiddleware<Middleman>
{
public HelloWorldHandler2() :base() { }
public HelloWorldHandler2(RequestDelegate next):base(next) { }
}
public class Middleman
: IHttpHandler
{
bool IHttpHandler.IsReusable => throw new NotImplementedException();
void IHttpHandler.ProcessRequest(HttpContext context)
{
throw new NotImplementedException();
}
}
すべてのクラスHandlerMiddlewareここで、はIHttpHandlerを実装しています(実装自体が実装されていないかどうかは関係ありません)。 –
User1
この "find"のコンテキストは何ですか? Visual Studioの使い方に関するアドバイスを探しているのですか、実行時にこの検索を実行するリフレクションコードを作成したいですか? –
@Damien_The_Unbeliever:いい質問です。実行時に検索すると意味します。 – User1