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

时间:2013-12-25 02:43:13

标签: c# .net wpf reflection datamodel

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

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

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

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

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

2 个答案:

答案 0 :(得分:4)

您可以在应用程序域中加载所有活动程序集,然后遍历每个程序集的类型以查找名称匹配。但是,如果没有程序集名称,则无法使用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 { }

答案 1 :(得分:1)

尝试is运算符。

if (DataContext is INotifyPropertyChanged && DataContext is ITObject)
{
   // magic
}

你也有IsAssignableFrom向后。

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