Reflectionを持つTypeからクラスを取得し、C#でTypeを持つ汎用コンストラクタを呼び出します。

c# dapper generics reflection types

質問

私はDapperと一緒に作業しています。私はモデルクラスを繰り返し処理し、 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'の代わりにtypeからクラスを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);

私はintellisenseなしでこれを書いていて、あなたのコードをスキミングしているだけなので、私は間違いを犯したかどうか私に教えてください。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ