在 C# 中通過反射訪問屬性 (Accessing attribute via reflection in C#)


問題描述

在 C# 中通過反射訪問屬性 (Accessing attribute via reflection in C#)

So I'm trying to access data from a custom attribute in C# using reflection what I have is this:

attribute class:

[System.AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly)]
public class Table : System.Attribute
{
    public string Name { get; set; }

    public Table (string name)
    {
        this.Name = name;
    }
}

I have a separate assembly with the following:

[Table("Data")]
public class Data
{
    public int PrimaryKey { get; set; }
    public string BankName { get; set; }
    public enum BankType { City, State, Federal };
}

In the main program I enumerate all the files in the current directory, and filter all the dll files. Once I have the dll files I run:

var asm = Assembly.LoadFile(file);
var asmTypes = asm.GetTypes();

From here I try and load the Table attribute using the Assembly method: GetCustomAtteribute(Type t, bool inherit)

However the Table attribute doesn't show in any of the dll, nor does it show as any of the types loaded in the assembly.

Any ideas what I'm doing wrong?

Thanks in advance.

UPDATE:

Here is the code that goes over the types and tries to pull the attribute:

foreach (var dll in dlls)
            {
                var asm = Assembly.LoadFile(dll);
                var asmTypes = asm.GetTypes();
                foreach (var type in asmTypes)
                {
                    Table.Table[] attributes = (Table.Table[])type.GetCustomAttributes(typeof(Table.Table), true);

                    foreach (Table.Table attribute in attributes)
                    {
                        Console.WriteLine(((Table.Table) attribute).Name);
                    }
                }
        }

參考解法

方法 1:

If Table.Table is in a separate assembly that both assemblies reference (i.e. there is only one Table.Table type), then that should work. However, the issue suggests that something is amiss. I recommend doing something like:

    foreach (var attrib in Attribute.GetCustomAttributes(type))
    {
        if (attrib.GetType().Name == "Table")
        {
            Console.WriteLine(attrib.GetType().FullName);
        }
    }

and putting a breakpoint on the Console.WriteLine, so you can see what is happening. In particular, look at:

bool isSameType = attrib.GetType() == typeof(Table.Table);
bool isSameAssembly = attrib.GetType().Assembly == typeof(Table.Table).Assembly;

Incidentally, I strongly recommend calling that TableAttribute.

(by Toni KostelacMarc Gravell)

參考文件

  1. Accessing attribute via reflection in C# (CC BY‑SA 3.0/4.0)

#.net-4.0 #attributes #reflection #.net #C#






相關問題

SendKeys.Send NullReferenceException (SendKeys.Send NullReferenceException)

訪問 MarkupExtension.ProvideValue 中的構造函數參數 (Access to a constructor parameter within MarkupExtension.ProvideValue)

調試時使用 WorkflowInvoker 發生瘋狂的內存洩漏 (Crazy memory leak with WorkflowInvoker while debugging)

為跨域的 .NET Framework 靜默安裝創建部署應用程序? (Creating a deployment application for .NET Framework silent install across domain?)

Windows 窗體關閉後刪除的窗體數據 (Form data erased after Windows form is closed)

如何從 php wordpress 服務器呈現 aspx 頁面 (How to render an aspx page from a php wordpress server)

嘗試通過方法“System.Web.Helpers.Json.Decode(System.String)”訪問字段“System.Web.Helpers.Json._serializer”失敗 (Attempt by method 'System.Web.Helpers.Json.Decode(System.String)' to access field 'System.Web.Helpers.Json._serializer' failed)

如何使用 Windows 資源管理器顯示項目和詳細信息展開/折疊 (How to Display Items and Details with Windows Explorer Expand/Collapse)

在 C# 中通過反射訪問屬性 (Accessing attribute via reflection in C#)

連續輸入時不要引發 TextChanged (Don't raise TextChanged while continuous typing)

MSMQ 異步異常行為 - .NET 4.0 與 .NET 2.0 (MSMQ asynchronous exception behavior - .NET 4.0 vs .NET 2.0)

多線程 WMI 調用 - 如何最好地處理這個? (Multithreading WMI calls - how best to handle this?)







留言討論