提问人:Dominique 提问时间:6/30/2023 更新时间:6/30/2023 访问量:65
如何在 C 中循环访问类名列表#
How to loop through a list of classnames in C#
问:
我正在开发一个基于模板的 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 个案例中的两个),我想以一种更简单的方式做到这一点,例如:Alarm
Area
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}]");
}
}
答:
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循环来浏览“不同”的集合。但是,当你以这种方式编写代码时,设计中就出现了问题。当然,这属于代码气味。无论如何,对于生产代码,我不会使用它。对于调试:可以检查更新的频率。
下一个:为什么模板只能在头文件中实现?
评论
database
DbContext
myAssembly.GetTypes().Where(x => x.BaseType== typeof(DbContext))