关于.net:如何使用C#中的反射获取类型的完全限定名称

How to get Fully Qualified Name of a Type using Reflection in C#

我有一个场景需要检查控件的DataContext是否正在实现"InotifyPropertyChanged"和另一个名为"ItObject"的接口。接口"ITObject"位于其他程序集中,实现类称为"TobjectBase",它具有一个名为"TobjectChanged"的事件。

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

我所拥有的问题是,我所拥有的唯一信息是这些类/接口名称的文本表示,除此之外,我需要在运行时检查控件的DataContext是否正在实现这些接口,并挂接到TobjectChanged事件并对其作出反应。

我尝试使用type.gettype("tobjectbase")来检查它,但我需要完全限定的名称,不是吗?因为它们都位于一个我不知道的不同的组件中。此外,isassignablefrom("itObject")也会失败。

我想知道这里的用户库是否能帮助我。


您可以加载应用程序域中的所有活动程序集,然后遍历每个程序集的类型以查找名称匹配。但是,如果没有程序集名称,就不能像您看到的那样使用Type.GetType()

下面的简单程序对我有用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 { }


尝试使用is运算符。

1
2
3
4
if (DataContext is INotifyPropertyChanged && DataContext is ITObject)
{
   // magic
}

你也有IsAssignableFrom向后。

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