Récupère la classe de Type avec Reflection et appelle un constructeur générique avec Type en C #

c# dapper generics reflection types

Question

Je travaille avec Dapper et je veux parcourir mes classes de modèle et définir le mappage de type pour toute classe ayant un champ décoré d'un 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
}

Dans ma bibliothèque de classes de modèles, je parcourt tous les types possibles; Maintenant, je dois appeler le constructeur ColumnAttributeTypeMapper<T> générique avec la classe du type.

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>());
            }
        }
    }
}

Comment puis-je passer la classe du type au lieu du type 'mappedType' au new ColumnAttributeTypeMapper<classof(mappedType)?>()

J'ai trouvé cela comme une question similaire , mais j'ai besoin d'appeler le constructeur générique au lieu d'une méthode générique avec le Type .

Si cela ne peut pas être fait, pourriez-vous s'il vous plaît expliquer la raison?

Répondre

Voici comment la cartographie a fonctionné comme suggéré par 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);
}

Réponse acceptée

Vous aurez besoin de la méthode Type.MakeGenericType ; l'utilisation est la suivante:

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

J'écris ceci sans intellisense et seulement après avoir écrémé votre code, alors s'il vous plaît laissez-moi savoir si j'ai fait des erreurs et je les corrigerai.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi