Reflection을 가진 Type으로부터 클래스를 가져오고 C #에서 Type을 가진 일반 생성자를 호출하십시오.

c# dapper generics reflection types

문제

나는 Dapper와 함께 일하고 있으며, 모델 클래스를 반복하고 ColumnAttribute 장식 된 필드를 갖는 모든 클래스에 대해 타입 매핑을 설정 ColumnAttribute 합니다.

public class ColumnAttributeTypeMapper<T> : FallbackTypeMapper
{
    public static readonly string ColumnAttributeName = "ColumnAttribute";

    public ColumnAttributeTypeMapper()
        : base(new SqlMapper.ITypeMap[]
        {
            new CustomPropertyTypeMap(typeof (T), SelectProperty),
            new DefaultTypeMap(typeof (T))
        })
    {
    }
    // implementation of SelectProperty and so on...
    // If required, full implementation is on https://gist.github.com/senjacob/8539127
}

내 모델 클래스 라이브러리에서 가능한 모든 유형을 반복합니다. 이제는 유형의 클래스로 일반 ColumnAttributeTypeMapper<T> 생성자를 호출해야합니다.

using System.Web;
using Dapper;

[assembly : PreApplicationStartMethod(typeof(Model.Initiator), "RegisterTypeMaps")]

namespace Model
{
    class Initiator
    {
        public static void RegisterTypeMaps()
        {
            var mappedTypes = Assembly.GetAssembly(typeof (Initiator)).GetTypes().Where(
                f =>
                f.GetProperties().Any(
                    p =>
                    p.GetCustomAttributes(false).Any(
                        a => a.GetType().Name == ColumnAttributeTypeMapper<dynamic>.ColumnAttributeName)));

            // I want to skip registering each class manually :P
            // SqlMapper.SetTypeMap(typeof(Model1), new ColumnAttributeTypeMapper<Model1>());
            // SqlMapper.SetTypeMap(typeof(Model2), new ColumnAttributeTypeMapper<Model2>());

            foreach (var mappedType in mappedTypes)
            {
                SqlMapper.SetTypeMap(mappedType, new ColumnAttributeTypeMapper<mappedType>());
            }
        }
    }
}

어떻게 'mappedType'유형 대신에 new ColumnAttributeTypeMapper<classof(mappedType)?>() 클래스를 전달할 수 new ColumnAttributeTypeMapper<classof(mappedType)?>()

이 질문을 비슷한 질문으로 찾았지만 Type 이있는 일반 메소드 대신 일반 생성자를 호출해야합니다.

끝낼 수 없다면 그 이유를 설명해 주시겠습니까?

대답

이것은 Tom이 제안한대로 매핑이 작동하는 방식입니다.

var mapper = typeof(ColumnAttributeTypeMapper<>);
foreach (var mappedType in mappedTypes)
{
    var genericType = mapper.MakeGenericType(new[] { mappedType });
    SqlMapper.SetTypeMap(mappedType, Activator.CreateInstance(genericType) as SqlMapper.ITypeMap);
}

수락 된 답변

Type.MakeGenericType 메서드가 필요합니다. 사용법은 다음과 같습니다.

var columnType = typeof(ColumnAttributeTypeMapper<>);
var genericColumn = columnType.MakeGenericType(new[] {typeof(mappedType)});
var instance = Activator.CreateInstance(genericColumn);

나는 인텔리 센스없이이 글을 쓰고 있고 코드 만 다룰 뿐이다. 그래서 내가 실수를했는지 여부를 알려 주면 내가 바로 잡을 것이다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow