读取派生类的属性值

时间:2019-04-22 05:34:58

标签: c# inheritance static attributes

我正在构建可与SQLite一起使用的应用程序,我现在要做的是获取每个实体的表创建字符串,这些字符串应使用以下代码存储:

table_creation_string1 = Book.GetTableCreationString();
table_creation_string2 = Scroll.GetTableCreationString();

这将允许我在使用自定义属性存储表名和字段名的新实体创建方面做最少的工作。

这是我的设置示例:

[System.AttributeUsage(System.AttributeTargets.Class)]
public class DBItemAttribute : System.Attribute
{
    public string TableName;
    public DBItemAttribute(string table_name)
    {
        TableName = table_name;
    }
}

internal abstract class DBItem
{
    ...
}


[DBItemAttribute("book_table")]
internal class Book : DBItem
{
    ...
}

[DBItemAttribute("scroll_table")]
internal class Scroll : DBItem
{
    ...
}

我面临的问题是,如果不构造对象,就无法获取Book和Scroll类的属性值。换句话说-使用类似这样的方式:

string table1 = Scroll.GetTableName();
string table2 = Book.GetTableName();

输出下一个值

"scroll_table"
"book_table"

因此,我正在寻找最佳的解决方案或一些好的替代方案。

我已经了解到,基类中的静态方法对此不起作用,因为似乎无法获取派生类信息来调用基中定义的静态方法。

UPD: 像

这样的代码
table_creation_string1 = new Book().GetTableCreationString();

可以肯定地工作,但是我想知道是否可以按照上面描述的方式完成。

3 个答案:

答案 0 :(得分:2)

Attributes是类的属性,因此您无需创建此类的实例即可获取这些值。您可以为此创建一个单独的帮助程序类:

sliderImages[current + 1].style.display = "block"; 

所以现在您可以像这样使用它:

internal static class DBHelpers
{
    public static string GetTableName<TDBItem>()
        where TDBItem : DBItem
    {
        var attribute = typeof(TDBItem).GetCustomAttribute<DBItemAttribute>();
        return attribute?.TableName;
    }
}

答案 1 :(得分:1)

静态类方法

只需将internal class Bookinternal class Scroll更改为静态,如static class Bookstatic class Book。这是整个静态类的目的。

静态类别定义

静态类是无法实例化的类。该类的唯一目的是提供其继承的类的蓝图。使用C#中的“ static”关键字创建静态类。静态类只能包含静态成员。您无法为静态类创建对象。

实例化并调用方法 否则,您可以实例化它并按如下所示调用方法:new Book().GetTableName()

答案 2 :(得分:0)

尝试此操作,在创建新类时添加一个类名及其对应的表名。


    public class ClassFactory
        {
            public static Action GetTableName(string className)
            {
                switch (className)
                {
                    case "Scroll": return "Book_table";
                    case "Book": return "Book_table";
                }
            }
         }

叫这个课:


string table1 = ClassFactory.GetTableName("Scroll");
string table2 = ClassFactory.GetTableName("Book");