【问题标题】:Read attribute value of derived class读取派生类的属性值
【发布时间】:2019-04-22 05:34:57
【问题描述】:

我正在构建将与 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 类的属性值。换句话说-像这样使用smth:

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

下一个值输出

"scroll_table"
"book_table"

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

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

更新: 像

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

确实有效,但我想知道是否可以按照我上面描述的方式完成。

【问题讨论】:

  • 应该可以在不构造对象的情况下获取属性信息。属性是类型的属性。看看这个:stackoverflow.com/questions/2656189/…
  • 还有你为什么要重新发明轮子,假设已经有库处理数据库创建/处理:docs.microsoft.com/en-us/ef/ef6/modeling/code-first/workflows/…
  • 你是对的,我可以在不构造对象的情况下获得 t,但在这种情况下,我需要在我使用的每个类中编写实际上相同的方法,并且有几十个。感谢您的链接,我会尽快检查它

标签: c# inheritance static attributes


【解决方案1】:

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

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

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

var tableName1 = DBHelpers.GetTableName<DBHelpers>();
var tableName2 = DBHelpers.GetTableName<Book>();

【讨论】:

  • 谢谢,由于某种原因没有考虑到这一点。在逻辑上对我来说比从实体本身生成字符串要好得多。
【解决方案2】:

静态类方法

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

静态类定义

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

实例化并调用方法 否则你可以实例化它并像这样调用方法:new Book().GetTableName()

【讨论】:

  • 问题是我需要一直对对象进行操作,而这种情况是我想在不创建对象的情况下使用它们的唯一情况。主要思想是创建可用于从数据库中加载有关实体的信息的类,但同时我想像“模板”一样使用它们来创建表
  • 哦,我明白了,那么 new Book().GetTableName() 呢?我会将它作为替代添加到我的解决方案中
  • 这肯定有效,只是想知道是否有一种方法可以像我在帖子中描述的那样,对我来说是某种语法糖
  • 关于属性的全部内容是你应该创建一个类的实例来获取这个值。如果它对你有用 - 只需删除所有这些属性 - 并创建正常的内部属性。
  • @vasily.sib 最初使用属性来存储 DB 的字段名称,这可能与类中的字段名称不同。所以我可以为这些对象中的任何一个获取 UPDATE、INSERT 和其他字符串,并更轻松地更改值名称
【解决方案3】:

试试这个,添加一个类名及其对应的表名,当你创建新的。

公共类 ClassFactory { 公共静态操作 GetTableName(字符串类名) { 开关(类名) { 案例“滚动”:返回“Book_table”; 案例“书”:返回“书表”; } } }

调用这个类:

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

【讨论】:

    猜你喜欢
    • 2016-04-21
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 2011-05-23
    • 2022-01-08
    相关资源
    最近更新 更多