C#、泛型、类型和 NHibernate
C#, Generics, Type and NHibernate
我正在结合 NHibernate 学习 C# 中泛型的强大功能。我想在粘贴的代码中尝试以下操作。
在尝试对 N 个 NHibernate 对象进行一些 post 处理时,我研究了一种利用泛型的实用方法,使其适用于我们现在使用的所有 NHibernate 映射 class,或者在将来。它有效,但我需要为每个映射 class 对每个调用进行硬编码。这很痛苦,并且需要随着我们的模式和映射随时间变化而不断更新。
我确实有一个最新的列表,其中包含所有映射 classes,这些映射是通过我动态生成的 NHibernate 映射按字符串名称排列的。如果有办法使用这个字符串名称列表来调用我的基于泛型的方法,我会非常高兴。
谁能告诉我这是否可行?我需要另找路线吗?
提前致谢!!!
public static void ProcessSomeItems()
{
// *************************************************************
// As of now I have to list all classes as such to be processed
// It works but I have to update manually when new mapping classes are created
// *************************************************************
NHibDoSomethingUtil<AspnetMembership>();
NHibDoSomethingUtil<AspnetProfile>();
NHibDoSomethingUtil<AspnetRole>();
NHibDoSomethingUtil<AspnetUser>();
// and so forth...
// I have a up-to-date list of all mappings from "HbmMapping" and can get a list of all in the
// list form as below
List<string> mappingNames = new List<string>();
foreach (string mappingName in mappingNames)
{
Type theType = Type.GetType(mappingName);
// I know I'm getting Types and Generics classes and so forth all jumbled but
// how in the heck would I do something like the below?
NHibDoSomethingUtil<theType>(); // Obviously doesn't compile ;-)
}
}
// Generic method
public static void NHibDoSomethingUtil<T>() where T : class
{
using (ISession session = sourceDBSessionFactory.OpenSession())
{
foreach (dynamic item in new List<T>(session.QueryOver<T>().List()))
{
// Process item;
}
}
}
ecsousa 提供了很好的意见,我能够通过以下内容完成我需要的工作。
foreach (HbmClass mappingClass in mapping.Items)
{
Console.WriteLine(" -- Discovered Mapping: " + mappingClass.Name);
Type mappingClassType = Type.GetType(mappingClass.Name);
var genericMethod = typeof(Migration).GetMethod("NHibDoSomethingUtil");
var method = genericMethod.MakeGenericMethod(mappingClassType);
method.Invoke(null, null);
}
您将需要使用反射来完成此操作。不要直接调用 NHibDoSomethingUtil,试试这个:
var genericMethod = typeof(TheClassName).GetMethod("NHibDoSomethingUtil");
var method = genericMethod.MakeGenericMethod(theType);
method.Invoke(null, null);
请注意,您必须将 TheClassName
替换为包含这两种方法的 class。
记住这种代码很慢,你应该非常小心地使用它。
我正在结合 NHibernate 学习 C# 中泛型的强大功能。我想在粘贴的代码中尝试以下操作。
在尝试对 N 个 NHibernate 对象进行一些 post 处理时,我研究了一种利用泛型的实用方法,使其适用于我们现在使用的所有 NHibernate 映射 class,或者在将来。它有效,但我需要为每个映射 class 对每个调用进行硬编码。这很痛苦,并且需要随着我们的模式和映射随时间变化而不断更新。
我确实有一个最新的列表,其中包含所有映射 classes,这些映射是通过我动态生成的 NHibernate 映射按字符串名称排列的。如果有办法使用这个字符串名称列表来调用我的基于泛型的方法,我会非常高兴。
谁能告诉我这是否可行?我需要另找路线吗?
提前致谢!!!
public static void ProcessSomeItems()
{
// *************************************************************
// As of now I have to list all classes as such to be processed
// It works but I have to update manually when new mapping classes are created
// *************************************************************
NHibDoSomethingUtil<AspnetMembership>();
NHibDoSomethingUtil<AspnetProfile>();
NHibDoSomethingUtil<AspnetRole>();
NHibDoSomethingUtil<AspnetUser>();
// and so forth...
// I have a up-to-date list of all mappings from "HbmMapping" and can get a list of all in the
// list form as below
List<string> mappingNames = new List<string>();
foreach (string mappingName in mappingNames)
{
Type theType = Type.GetType(mappingName);
// I know I'm getting Types and Generics classes and so forth all jumbled but
// how in the heck would I do something like the below?
NHibDoSomethingUtil<theType>(); // Obviously doesn't compile ;-)
}
}
// Generic method
public static void NHibDoSomethingUtil<T>() where T : class
{
using (ISession session = sourceDBSessionFactory.OpenSession())
{
foreach (dynamic item in new List<T>(session.QueryOver<T>().List()))
{
// Process item;
}
}
}
ecsousa 提供了很好的意见,我能够通过以下内容完成我需要的工作。
foreach (HbmClass mappingClass in mapping.Items)
{
Console.WriteLine(" -- Discovered Mapping: " + mappingClass.Name);
Type mappingClassType = Type.GetType(mappingClass.Name);
var genericMethod = typeof(Migration).GetMethod("NHibDoSomethingUtil");
var method = genericMethod.MakeGenericMethod(mappingClassType);
method.Invoke(null, null);
}
您将需要使用反射来完成此操作。不要直接调用 NHibDoSomethingUtil,试试这个:
var genericMethod = typeof(TheClassName).GetMethod("NHibDoSomethingUtil");
var method = genericMethod.MakeGenericMethod(theType);
method.Invoke(null, null);
请注意,您必须将 TheClassName
替换为包含这两种方法的 class。
记住这种代码很慢,你应该非常小心地使用它。