EF и Generic

Оставляю кусочек кода себе на память. Универсальный, но в моем случае требует костылей.

#region Generic
        public void CreateLang(TModel langModel, out IEnumerable diff)
        {
            Type entityType = this.TypesModelEntity[typeof(TModel)]; //вот костыль
            var langType = this.TypesEntityLang[entityType]; //и еще один

            Type genericClass = typeof(EFLangRepository);
            Type constructedClass = genericClass.MakeGenericType(typeof(TModel), entityType, langType);

            object repo = Activator.CreateInstance(constructedClass);

            diff = new List();
            object[] args = new object[] { langModel, diff };

            MethodInfo magicMethod = constructedClass.GetMethod("CreateLang");
            object magicValue = magicMethod.Invoke(repo, args);
            diff = args[1] as List;
        }
        #endregion


Про создание экземпляра объекта

http://stackoverflow.com/questions/266115/pass-an-instantiated-system-type-as-a-type-parameter-for-a-generic-class

using System;
using System.Reflection;

public class Generic
{
    public Generic()
    {
        Console.WriteLine("T={0}", typeof(T));
    }
}

class Test
{
    static void Main()
    {
        string typeName = "System.String";
        Type typeArgument = Type.GetType(typeName);

        Type genericClass = typeof(Generic);
        // MakeGenericType is badly named
        Type constructedClass = genericClass.MakeGenericType(typeArgument);

        object created = Activator.CreateInstance(constructedClass);
    }
}

Note: if your generic class accepts multiple types, you must include the commas when you omit the type names, for example:

Type genericClass = typeof(IReadOnlyDictionary);
Type constructedClass = genericClass.MakeGenericType(typeArgument1, typeArgument2);

И MSDN

https://msdn.microsoft.com/ru-ru/library/a89hcwhh(v=vs.110).aspx

public class MagicClass
{
    private int magicBaseValue;

    public MagicClass()
    {
        magicBaseValue = 9;
    }

    public int ItsMagic(int preMagic)
    {
        return preMagic * magicBaseValue;
    }
}

public class TestMethodInfo
{
    public static void Main()
    {
        // Get the constructor and create an instance of MagicClass

        Type magicType = Type.GetType("MagicClass");
        ConstructorInfo magicConstructor = magicType.GetConstructor(Type.EmptyTypes);
        object magicClassObject = magicConstructor.Invoke(new object[]{});

        // Get the ItsMagic method and invoke with a parameter value of 100

        MethodInfo magicMethod = magicType.GetMethod("ItsMagic");
        object magicValue = magicMethod.Invoke(magicClassObject, new object[]{100});

        Console.WriteLine("MethodInfo.Invoke() Example\n");
        Console.WriteLine("MagicClass.ItsMagic() returned: {0}", magicValue);
    }
}

Вызов метода

http://stackoverflow.com/questions/232535/how-do-i-use-reflection-to-call-a-generic-method

MethodInfo method = typeof(Sample).GetMethod("GenericMethod");
MethodInfo generic = method.MakeGenericMethod(myType);
generic.Invoke(this, null);

Про generic-метод

http://stackoverflow.com/questions/2247553/how-to-pass-variable-of-type-type-to-generic-parameter

var method =
    typeof(MetaDataUtil)
    .GetMethod("GetColumnasGrid")
    .MakeGenericMethod(new [] { type })
    .Invoke(null, null);

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *