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

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

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

我遇到的问题是,我唯一拥有的信息只是这些类/接口名称的文本表示形式,没有更多的信息,但我需要在运行时检查控件的 DataContext 是否实现了这些接口,并挂接到 TObjectChanged 事件并对其进行反应。

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

我想知道这里的用户群能否帮助我解决这个问题。


可能是重复的问题:如何使用C#反射确定类型是否实现了接口 - w.b
2个回答

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
尝试使用 is 运算符。
if (DataContext is INotifyPropertyChanged && DataContext is ITObject)
{
   // magic
}

你的 IsAssignableFrom 是反过来的。
typeof(ITObject).IsAssignableFrom(DataContext.GetType());

那真的不起作用。我没有它的引用,我只知道它的名称的文本表示形式。 代码 if(currentDataContext is Type.GetType("ITObject")) { // 功能 } 也不起作用... - Harsha
我以为你说你有一个指向类型 ITObject 的引用? - Daniel A. White
不,我没有ITObject的引用,因为我们没有将它们的程序集添加到我们的项目中。请看下面我的帖子,了解我如何尝试实现它 :) PS:我无法在评论中发布代码,所以我单独回复了它 - Harsha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接