C#将类添加到通用List并稍后检索类型

时间:2016-12-09 16:15:26

标签: c# list generics

我有以下课程:

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

3 个答案:

答案 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编译一个。然而,这可能不是正确的模式。