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

C# 如何在C中使用反射获取类型的完全限定名#,c#,.net,wpf,reflection,datamodel,C#,.net,Wpf,Reflection,Datamodel,我有一个场景,需要检查控件的DataContext是否正在实现“INotifyPropertyChanged”和另一个名为“ITObject”的接口。接口“ITObject”位于其他一些程序集中,实现类称为“TObjectBase”,它有一个名为“TObjectChanged”的事件 我们不会将他们的程序集添加到我们的项目中,而是将我们的程序集添加到我们构建并提供给他们的项目中 我的问题是,我仅有的信息是这些类/接口名称的文本表示,仅此而已,但我需要在运行时检查控件的DataContext是否正

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

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

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

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


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

试试
is
操作符

if (DataContext is INotifyPropertyChanged && DataContext is ITObject)
{
   // magic
}
您还有
IsAssignableFrom
向后

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

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

这并不是真正的锻炼。我没有对它的引用,关于它的名字我只知道它的文本表示<代码>代码如果(currentDataContext是Type.GetType(“ITObject”){//Functionality}也不起作用…我以为你说你有一个对类型
ITObject
的引用?不,我没有ITObject的引用,因为我们没有将它们的程序集添加到我们的项目中。请看我下面的帖子,了解我是如何做到这一点的:)PS:我无法在我的评论中发布代码,所以我作为一个单独的回复发布,而不是可能的重复