1

所以我正在尝试使用反射从 C# 中的自定义属性访问数据,我所拥有的是:

属性类:

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

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

我有一个单独的程序集,其中包含以下内容:

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

在主程序中,我枚举了当前目录下的所有文件,并过滤了所有的 dll 文件。一旦我有我运行的 dll 文件:

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

从这里我尝试使用 Assembly 方法加载 Table 属性:GetCustomAtteribute(Type t, bool inherit)

但是,Table 属性不会显示在任何 dll 中,也不会显示为程序集中加载的任何类型。

任何想法我做错了什么?

提前致谢。

更新:

这是遍历类型并尝试提取属性的代码:

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);
                    }
                }
        }
4

1 回答 1

3

如果Table.Table在两个程序集都引用的单独程序集中(即只有一种Table.Table类型),那么应该可以。但是,这个问题表明有些不对劲。我建议这样做:

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

并在 上放置一个断点Console.WriteLine,这样你就可以看到发生了什么。特别是,看看:

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

顺便说一句,我强烈建议调用它TableAttribute

于 2013-07-15T19:24:02.963 回答