我有以下课程:
class A {
}
class B {
}
class C {
}
我将它们添加到列表中:
List<object> ListOfClasses = new List<object>();
ListOfClasses.Add(new A());
ListOfClasses.Add(new B());
ListOfClasses.Add(new C());
processClasses(ListOfClasses);
现在我无法弄明白:
processClasses(List<object> myClasses) {
foreach(object obj in myClasses) {
doSomeWork(obj.GetType(), new OtherWork<the class of obj>());
}
}
MoreWork&lt;&gt; 的参数化类型应该是什么。如果我一次只做一节课,那么我会做类似的事情:
doSomeWork(typeof(A), new OtherWork<A>());
在这种情况下,其他工作是ColumnAttributeTypeMapper: Dapper Custom Attribute Mapper
答案 0 :(得分:1)
( from last edit )当然还有更多需要处理的类。 otherWork基本上是ColumnAttributeTypeMapper:gist.github.com/kalebpederson/5460509
如果这是您的唯一约束,那么最简单的方法是创建一个ColumnAttributeTypeMapper
的新实现,它不是通用的,而是采用类型参数。
public class ColumnAttributeTypeMapper : FallbackTypeMapper
{
public ColumnAttributeTypeMapper(object instance)
: this (instance.GetType())
{
}
public ColumnAttributeTypeMapper(Type T)
: base(new SqlMapper.ITypeMap[]
{
new CustomPropertyTypeMap(
T,
(type, columnName) =>
type.GetProperties().FirstOrDefault(prop =>
prop.GetCustomAttributes(false)
.OfType<ColumnAttribute>()
.Any(attr => attr.Name == columnName)
)
),
new DefaultTypeMap(T)
})
{
}
}
答案 1 :(得分:0)
processClasses(List<object> myClasses)
{
foreach(A obj in myClasses.OfType<A>()) {
doSomeWork(A.GetType(), new OtherWork<A>());
}
foreach(B obj in myClasses.OfType<B>()) {
doSomeWork(B.GetType(), new OtherWork<B>());
}
foreach(C obj in myClasses.OfType<C>()) {
doSomeWork(C.GetType(), new OtherWork<C>());
}
}
答案 2 :(得分:0)
你不能这样做的原因是因为编译器需要提前知道要使用的类型OtherWork
,以便它可以为那些类生成类。
您可以在运行时执行此操作。稍后使用MakeGenericMethod
编译一个。然而,这可能不是正确的模式。