如何在 C# 中使用反射获取类型的完全限定名称

Posted

技术标签:

【中文标题】如何在 C# 中使用反射获取类型的完全限定名称【英文标题】:How to get Fully Qualified Name of a Type using Reflection in C# 【发布时间】:2014-01-13 03:36:42 【问题描述】:

我有一个场景,我需要检查控件的 DataContext 是否正在实现“INotifyPropertyChanged”和另一个名为“ITObject”的接口。接口“ITObject”位于其他程序集中,实现类称为“TObjectBase”,其中有一个名为“TObjectChanged”的事件。

我们不会将他们的程序集添加到我们的项目中,而是他们会将我们的程序集添加到我们构建并提供给他们的项目中。

我的问题是我拥有的唯一信息是这些类/接口名称的文本表示,仅此而已,但我需要在运行时检查控件的 DataContext 是否正在实现这些接口并挂钩到 TObjectChanged 事件并做出反应。

我尝试使用 Type.GetType("TObjectBase") 来检查它,但我需要完全限定名称,不是吗?因为它们都位于我不知道的不同程序集中。此外,IsAssignableFrom("ITObject") 也失败了。

我想知道这里的用户群是否可以帮助我。

【问题讨论】:

How to determine if a type implements an interface with C# reflection 的可能重复项 【参考方案1】:

试试is 运算符。

if (DataContext is INotifyPropertyChanged && DataContext is ITObject)

   // magic

你也有IsAssignableFrom倒退。

typeof(ITObject).IsAssignableFrom(DataContext.GetType());

【讨论】:

那并不是真正的锻炼。我没有对它的引用,我唯一知道它的名字是文本表示。 code if(currentDataContext is Type.GetType("ITObject")) // Functionality 也不起作用... 我以为你说你引用了 ITObject 类型? 不,我没有 ITObject 的引用,因为我们没有将它们的程序集添加到我们的项目中。请参阅我的以下帖子,了解我如何尝试实现它:) PS:我无法在我的 cmets 中发布代码,所以我将其作为单独的回复发布【参考方案2】:

您可以加载应用程序域中的所有活动程序集,然后遍历每个程序集的类型以查找名称匹配。但是,如果没有程序集名称,您将无法使用 Type.GetType(),如您所见。

以下简单程序对我有用。

class Program

    static void Main(string[] args)
    
        Console.WriteLine(GetFqTypeName("IMyInterface"));
        Console.ReadKey();
    

    static String GetFqTypeName(string shortTypeName)
    
        return AppDomain.CurrentDomain.GetAssemblies()
            .ToList()
            .SelectMany(x => x.GetTypes())
            .Where(x => x.Name == shortTypeName)
            .Select(x => x.FullName)
            .FirstOrDefault();
    


public interface IMyInterface  

【讨论】:

以上是关于如何在 C# 中使用反射获取类型的完全限定名称的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript Compiler API:如何在没有绝对路径的情况下获取类型的完全限定名称?

如何使用Ant获取完全限定的主机名

如何在 Python 中获取计算机的完全限定域名?

C#问题 如何获得一个文件夹的名称

unity的C#学习——泛型的创建与继承泛型集合类泛型中的约束和反射

c# 如何通过反射 获取属性值