如何在 C 中循环访问类名列表#

How to loop through a list of classnames in C#

提问人:Dominique 提问时间:6/30/2023 更新时间:6/30/2023 访问量:65

问:

我正在开发一个基于模板的 C# 应用程序。
此应用程序使用过程将条目保存到数据库中。
database.SaveChanged()

我想查看要更改的内容列表,可以使用以下方法完成这些更改:

IList<T> GetChanged<T>() where T : class;

这意味着我可以按如下方式执行此操作:

foreach (var t in database.GetChanged<Alarm>())
{
    log.Debug($"DB Change=[{t}]");
}
foreach (var t in database.GetChanged<Area>())
{
    log.Debug($"DB Change. ClassName=[{t.GetType()}], Change=[{t}]");
}
...

由于我有几十个类名(并且只是 53 个案例中的两个),我想以一种更简单的方式做到这一点,例如:AlarmArea

List<ClassNames> Class_List= {Alarm, Area, ..., Server.Domain.ClassName, ...}; 
// indeed, namespaces are possible

foreach (var entry in Class_List)
{
    foreach (var t in database.GetChanged<entry>())
    {
        log.Debug($"DB Change. ClassName=[{entry}], Change=[{t}]");

    }
}
C# 列表 模板 类名 typename

评论

0赞 Fildor 6/30/2023
是 EF Core DbContext 吗?database
0赞 Dominique 6/30/2023
不,对不起,它与 Telerik OpenAccess 有关。
1赞 MakePeaceGreatAgain 6/30/2023
然后获取从使用类似 .更好的是:只需让所有类型实现一个特定的接口即可。DbContextmyAssembly.GetTypes().Where(x => x.BaseType== typeof(DbContext))
2赞 Ralf 6/30/2023
查看 Telerik 的文档,似乎它们有一个非通用的表面,可以让您进行所有更改。此外,您在这里使用的东西是 2016 年停产的那个?
1赞 Selvin 6/30/2023
这回答了你的问题吗?使用 Type 变量调用泛型方法

答:

1赞 Jeroen van Langen 6/30/2023 #1

也许可以调用 via reflection 并填充 .GetChanged<T>()T

但我想我会创建一个这样的结构:

// put all results in a list
var classes = new List<IEnumerable<CommonBaseClass>> { 
    database.GetChanged<Alarm>(),
    database.GetChanged<Area>()
};

foreach (var entry in classes)
{
    foreach (var t in entry)
    {
        log.Debug($"DB Change. ClassName=[{entry}], Change=[{t}]");
    }
}

但是,我无法在这里测试它。(比如协方差)

好吧,你可以通过摸索在这些事情上浪费很多时间。

评论

0赞 Rand Random 6/30/2023
出于好奇,假设你有一个包含 200+ 表的数据库,你还会调用 200 次?每张桌子一次?database.GetChanged<xyz>(),
0赞 Rand Random 6/30/2023
并维护沿途每个新表的代码
0赞 Ralf 6/30/2023
该操作谈论的是“要更改”的事情,因此我假设它是关于在移交给数据库之前在本地内存中跟踪的事情。
1赞 Jeroen van Langen 6/30/2023
@RandRandom 这只是一个想法,你可以用for循环来浏览“不同”的集合。但是,当你以这种方式编写代码时,设计中就出现了问题。当然,这属于代码气味。无论如何,对于生产代码,我不会使用它。对于调试:可以检查更新的频率。