Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取实现IMyInterface的引用中的所有类型_C#_.net_Reflection - Fatal编程技术网

C# 如何获取实现IMyInterface的引用中的所有类型

C# 如何获取实现IMyInterface的引用中的所有类型,c#,.net,reflection,C#,.net,Reflection,我有一个项目包含许多参考资料。 我需要找到实现IMyInterface接口的所有类型 我尝试了AppDomain.CurrentDomain.GetAssemblys.SelectManyx=>x.GetTypes,但它没有返回引用中的所有类型 我该怎么做?我想问题可能是您引用的某些程序集当前未加载。可以使用-获取所有引用的程序集,但这只会生成名称 如果需要,可以继续加载部件并进一步检查 因此,一个可能的片段应该是 var types = System.Reflectio

我有一个项目包含许多参考资料。 我需要找到实现IMyInterface接口的所有类型

我尝试了AppDomain.CurrentDomain.GetAssemblys.SelectManyx=>x.GetTypes,但它没有返回引用中的所有类型


我该怎么做?

我想问题可能是您引用的某些程序集当前未加载。可以使用-获取所有引用的程序集,但这只会生成名称

如果需要,可以继续加载部件并进一步检查

因此,一个可能的片段应该是

    var types =
        System.Reflection.Assembly.GetExecutingAssembly()
            .GetReferencedAssemblies()
            .SelectMany(name => Assembly.Load(name).GetTypes())
            .Union(AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()));
要搜索实现接口的类型,请执行以下操作:

    var withInterfaces =
        types.Where(t => t.GetInterfaces().Any(i => i == typeof(IDisposable)));

如果这还不起作用,我也就迷路了…

我想问题可能是您引用的某些程序集当前未加载。可以使用-获取所有引用的程序集,但这只会生成名称

using System;
using System.Linq;
using System.Reflection;

// try this for fun:
using IMyInterface=System.Collections.IEnumerable;

namespace TestThat
{
    class MainClass
    {

        public static void Main (string[] args)
        {
            var x = AppDomain.CurrentDomain.GetAssemblies()
                .SelectMany(a => a.GetTypes())
                .Where(t => typeof(IMyInterface).IsAssignableFrom(t))
                .Where(t => !(t.IsAbstract || t.IsInterface))
                .Except(new [] { typeof(IMyInterface) });

            Console.WriteLine(string.Join("\n", x.Select(y=>y.Name).ToArray()));

        }
    }
}
如果需要,可以继续加载部件并进一步检查

因此,一个可能的片段应该是

    var types =
        System.Reflection.Assembly.GetExecutingAssembly()
            .GetReferencedAssemblies()
            .SelectMany(name => Assembly.Load(name).GetTypes())
            .Union(AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()));
要搜索实现接口的类型,请执行以下操作:

    var withInterfaces =
        types.Where(t => t.GetInterfaces().Any(i => i == typeof(IDisposable)));
如果这不起作用,我也会输的

using System;
using System.Linq;
using System.Reflection;

// try this for fun:
using IMyInterface=System.Collections.IEnumerable;

namespace TestThat
{
    class MainClass
    {

        public static void Main (string[] args)
        {
            var x = AppDomain.CurrentDomain.GetAssemblies()
                .SelectMany(a => a.GetTypes())
                .Where(t => typeof(IMyInterface).IsAssignableFrom(t))
                .Where(t => !(t.IsAbstract || t.IsInterface))
                .Except(new [] { typeof(IMyInterface) });

            Console.WriteLine(string.Join("\n", x.Select(y=>y.Name).ToArray()));

        }
    }
}
如果查找派生类并希望“跳过”基类:

            .Except(new [] { typeof(MyBaseClass) });
这是您的接口检测。我来看看你为什么没有得到所有类型的引用。我希望你的代码能做到这一点,Brb

如果查找派生类并希望“跳过”基类:

            .Except(new [] { typeof(MyBaseClass) });

这是您的接口检测。我来看看你为什么没有得到所有类型的引用。我希望你的代码能做到这一点,Brb。

你想在运行时做到这一点

如果您只需要大致了解这些信息,并且不必在运行时了解,您可以在Visual Studio中加载解决方案,然后右键单击接口IName{行中接口名称上的,然后选择“查找所有引用”-这将在代码中显示对接口的所有引用


如果它是您在运行时真正需要的东西,请参见上面的答案。

您想在运行时这样做吗

如果您只需要大致了解这些信息,并且不必在运行时了解,您可以在Visual Studio中加载解决方案,然后右键单击接口IName{行中接口名称上的,然后选择“查找所有引用”-这将在代码中显示对接口的所有引用



如果这是您在运行时真正需要的东西,那么请查看上面的答案。

如果程序集实现IMyInterface,我可以知道使用AssemblyName吗?程序集不实现接口,类实现接口。注意:这会吐出很多类型-在我的简单测试应用程序中是8384种类型!我想您知道-您可以使用这些类型来检查它们是否正确实现一些接口您可以使用GetInterface可能会更快,但我认为这一个更容易阅读。如果程序集实现IMyInterface,我可以知道使用AssemblyName吗?程序集不实现接口,类实现接口。注意:这会吐出很多类型-在我的简单测试应用程序中是8384种类型!我想您知道-您可以使用e类型来检查它们是否实现了一些接口您可以使用GetInterface可能会更快,但我认为这一个更易于阅读。这只返回当前域中的程序集。编辑:我刚刚检查过,这会返回所有引用程序集中的所有类。我在这里放了一个简化的演示,只列出了100个随机匹配项:Test1和Test2是否位于同一程序集中?我看到您将其放在同一个cs文件中。您阅读了源代码的其余部分吗?请注意,当前IMyInterface是…System.Object的别名:-我实际上在线提供了一个完整的工作示例。请参阅。您提到的是,我还使用本地接口和类型进行了测试。注意:我在is只返回当前域中的程序集。编辑:我刚刚检查过,这会返回所有引用程序集中的所有类。我在这里放了一个简化的演示,只列出了100个随机匹配:Test1和Test2是否位于同一个程序集中?我看到您将它放在同一个cs文件中。您阅读了源代码的其余部分吗?没有e当前IMyInterface是…System.Object的别名:-我实际上在线提供了一个完整的工作示例。请参阅。您提到的是,我还测试了本地接口和类型。注意:我测试了它。可能是您正在加载插件DLL吗?它可能只是加载到单独的AppDomain中:@sehe:我如何看待其他AppDomainn?AppDomain实际上是什么?这回避了这个问题。你正在加载插件DLL吗?另外,请阅读并获取起点。好的luckCan,请给我们一些上下文。我不清楚你想把这些代码放在哪里。是不是一个VS加载项必须检查当前项目的引用?是不是你用来检查的东西是dll的引用吗?还是你想告诉我们
检查您正在编写此代码的同一项目的引用?PS。您是否正在加载插件DLL?它可能只是加载到一个单独的AppDomain中:@sehe:我在其他AppDomain上看起来如何?AppDomain实际上是什么?这回避了这个问题。您正在加载插件DLL吗?此外,阅读和了解起点。好的,卢卡斯,请给我们一些背景。我不清楚你想把代码放在哪里。是否是必须检查当前项目引用的VS加载项?它是用来检查dll引用的东西吗?或者,您希望使用它来检查编写此代码的同一项目的引用吗?