EF и Generic

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

#region Generic
        public void CreateLang<TModel>(TModel langModel, out IEnumerable<RevisionObject> 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<RevisionObject>();
            object[] args = new object[] { langModel, diff };
 
            MethodInfo magicMethod = constructedClass.GetMethod("CreateLang");
            object magicValue = magicMethod.Invoke(repo, args);
            diff = args[1] as List<RevisionObject>;
        }
        #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<T>
{
    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);

Оставить комментарий


Примечание - Вы можете использовать эти HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>