相关疑难解决方法(0)

获取实现接口的所有类型

使用反射,如何使用最少的代码获得使用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)

c# reflection optimization lambda c#-3.0

524
推荐指数
11
解决办法
24万
查看次数

调用Assembly.GetTypes()时如何防止ReflectionTypeLoadException

我正在尝试使用类似于此的代码扫描程序集以查找实现特定接口的类型:

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(),例如,如果程序集包含引用当前不可用的程序集的类型.

就我而言,我对导致问题的类型不感兴趣.我正在搜索的类型不需要不可用的程序集.

问题是:是否有可能以某种方式跳过/忽略导致异常但仍处理程序集中包含的其他类型的类型?

.net reflection plugins .net-assembly

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

有没有办法强制所有引用的程序集加载到应用程序域?

我的项目设置如下:

  • 项目"定义"
  • 项目实施"
  • 项目"消费者"

项目"消费者"引用"定义"和"实现",但不静态引用"实现"中的任何类型.

当应用程序启动时,Project"Consumer"在"Definition"中调用静态方法,该方法需要在"Implementation"中查找类型

有没有办法可以在不知道路径或名称的情况下强制将任何引用的程序集加载到App域中,并且最好不必使用完整的IOC框架?

c# assemblies appdomain

72
推荐指数
4
解决办法
6万
查看次数

获取类型的所有派生类型

是否有更好的(更高性能或更好的代码;)方法来查找类型的所有派生类型?目前即时使用以下内容:

  1. 获取所用类型的所有类型
  2. 如果是'IsAssignable',请检查所有类型的类型

我想知道是否有更好的方式来做这件事?

.net c#

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

找出类型是否实现了通用接口

假设我有一个类型MyType.我想做以下事情:

  1. 找出MyType是否为某些T实现了IList接口.
  2. 如果(1)的答案为是,请找出T是什么.

看起来这样做的方法是GetInterface(),但这只允许您按特定名称进行搜索.有没有办法搜索"IList形式的所有接口"(如果可能的话,如果接口是IList的子接口,它也会有用.)

相关:如何确定类型是否实现特定的通用接口类型

.net c# reflection

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

.NET - 获取通用接口的所有实现?

关于" 通过反射实现接口 "的答案显示了如何获得接口的所有实现.但是,给定通用接口,IInterface<T>以下不起作用:

var types = TypesImplementingInterface(typeof(IInterface<>))
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释我如何修改该方法?

.net c# generics reflection interface

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

通过搜索特定的泛型接口参数获取实现泛型接口的类型

我想创建一个方法,该方法返回一个类型(或 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

.net c# reflection

7
推荐指数
1
解决办法
812
查看次数

基本接口的通用类型

我的班级结构(简化)

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.

  1. 如何使用反射来实现这一目标?

  2. 无论T是什么类型,我怎样才能确保类型实现Foo?就像是

bool bIsFoo = typeof(SomeType).IsAssignableFrom(Foo<>)

以上不起作用.

c# generics reflection .net-core

5
推荐指数
1
解决办法
163
查看次数

查找使用特定 T 类型实现某个通用接口的所有类型

我有几个类继承自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# generics reflection

2
推荐指数
1
解决办法
3913
查看次数