簡體   English   中英

如何在 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()如您所見。

以下簡單程序對我有用。

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運算符。

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

你也有IsAssignableFrom向后。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM