使用反射,如何使用最少的代码获得使用C#3.0/.NET 3.5实现接口的所有类型,并最大限度地减少迭代?
这就是我想要重写的内容:
foreach (Type t in this.GetType().Assembly.GetTypes())
if (t is IMyInterface)
; //do stuff
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用类似于此的代码扫描程序集以查找实现特定接口的类型:
public List<Type> FindTypesImplementing<T>(string assemblyPath)
{
var matchingTypes = new List<Type>();
var asm = Assembly.LoadFrom(assemblyPath);
foreach (var t in asm.GetTypes())
{
if (typeof(T).IsAssignableFrom(t))
matchingTypes.Add(t);
}
return matchingTypes;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,在某些情况下,我得到一个ReflectionTypeLoadException调用asm.GetTypes(),例如,如果程序集包含引用当前不可用的程序集的类型.
就我而言,我对导致问题的类型不感兴趣.我正在搜索的类型不需要不可用的程序集.
问题是:是否有可能以某种方式跳过/忽略导致异常但仍处理程序集中包含的其他类型的类型?
我的项目设置如下:
项目"消费者"引用"定义"和"实现",但不静态引用"实现"中的任何类型.
当应用程序启动时,Project"Consumer"在"Definition"中调用静态方法,该方法需要在"Implementation"中查找类型
有没有办法可以在不知道路径或名称的情况下强制将任何引用的程序集加载到App域中,并且最好不必使用完整的IOC框架?
是否有更好的(更高性能或更好的代码;)方法来查找类型的所有派生类型?目前即时使用以下内容:
我想知道是否有更好的方式来做这件事?
假设我有一个类型MyType.我想做以下事情:
看起来这样做的方法是GetInterface(),但这只允许您按特定名称进行搜索.有没有办法搜索"IList形式的所有接口"(如果可能的话,如果接口是IList的子接口,它也会有用.)
关于" 通过反射实现接口 "的答案显示了如何获得接口的所有实现.但是,给定通用接口,IInterface<T>以下不起作用:
var types = TypesImplementingInterface(typeof(IInterface<>))
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释我如何修改该方法?
我想创建一个方法,该方法返回一个类型(或 IEnumerable 类型),该类型实现一个采用类型参数的特定接口——但是我想通过该泛型类型参数本身进行搜索。作为示例,这更容易演示:
我想要的方法签名:
public IEnumerable<Type> GetByInterfaceAndGeneric(Type interfaceWithParam, Type specificTypeParameter)
Run Code Online (Sandbox Code Playgroud)
然后如果我有以下对象
public interface IRepository<T> { };
public class FooRepo : IRepository<Foo> { };
public class DifferentFooRepo : IRepository<Foo> {};
Run Code Online (Sandbox Code Playgroud)
然后我希望能够做到:
var repos = GetByInterfaceAndGeneric(typeof(IRepository<>), typeof(Foo));
Run Code Online (Sandbox Code Playgroud)
并获得一个包含类型FooRepo和的 IEnumerable DifferentFooRepo。
这与此问题非常相似,但是使用该示例,我想按两者IRepository<>和 by进行搜索User。
我的班级结构(简化)
interface Foo<T> { }
abstract class Bar1 : Foo<SomeClass> { }
abstract class Bar2 : Foo<SomeOtherClass> { }
class FinalClass1 : Bar1 { }
class FinalClass2 : Bar2 { }
Run Code Online (Sandbox Code Playgroud)
现在,只有类型FinalClass1和FinalClass2,我需要从Foo接口获取它们各自的T类型 - FinalClass1的SomeClass和FinalClass2的SomeOtherClass.抽象类可以实现更通用的接口,但始终只有一个Foo.
如何使用反射来实现这一目标?
无论T是什么类型,我怎样才能确保类型实现Foo?就像是
bool bIsFoo = typeof(SomeType).IsAssignableFrom(Foo<>)
以上不起作用.
我有几个类继承自abstract class BrowsingGoal. 其中一些实现了一个名为ICanHandleIntent<TPageIntent> where TPageIntent: PageIntent.
举个具体的例子:
public class Authenticate : BrowsingGoal, ICanHandleIntent<AuthenticationNeededIntent>
{
...
}
Run Code Online (Sandbox Code Playgroud)
现在,我想扫描 CurrentDomain 的程序集以查找所有ICanHandleIntent使用AuthenticationNeededIntent. 这是我到目前为止所拥有的,但似乎没有找到任何东西:
protected BrowsingGoal FindNextGoal(PageIntent intent)
{
// Find a goal that implements an ICanHandleIntent<specific PageIntent>
var goalHandler = AppDomain.CurrentDomain
.GetAssemblies()
.SelectMany(assembly => assembly.GetTypes())
.FirstOrDefault(t => t.IsAssignableFrom((typeof (BrowsingGoal))) &&
t.GetInterfaces().Any(x =>
x.IsGenericType &&
x.IsAssignableFrom(typeof (ICanHandleIntent<>)) &&
x.GetGenericTypeDefinition() == intent.GetType()));
if (goalHandler != null)
return Activator.CreateInstance(goalHandler) as BrowsingGoal;
}
Run Code Online (Sandbox Code Playgroud)
一些帮助将不胜感激!
c# ×8
reflection ×7
.net ×5
generics ×3
.net-core ×1
appdomain ×1
assemblies ×1
c#-3.0 ×1
interface ×1
lambda ×1
optimization ×1
plugins ×1