C#键入Generic类

时间:2015-10-07 06:31:32

标签: c# asp.net-mvc reflection

我有一个MVC C#代码优先的项目。我想将一个类型传递给我的方法。我的方法需要一个类来工作。但我不想通过课 - 我希望它是动态的。有可能吗?

这是我的代码;

string item ="PERSON" // item is a parametric I give the table name to get the type of table 
Assembly asm = Assembly.Load("ProjectName");
Type entityType = asm.GetType(String.Format("NameSpace.Model.{0}", item));

 var test = LINQDynamic<>.GetQueryResult(ssa,entityType,ddd); // In LINQDynamic<> I want to use entityType like that LINQDynamic<entityType> but it's not acceptable what can I make the convert type to generic?..Because table name is parametric.Is it possible to convert that type?

public class LINQDynamic<TEntity> where TEntity: class
   {

       public static object GetQueryResult(object pkKey,Type type, params object[] pkKeys)
       {
                     //TODO
       }
    }

4 个答案:

答案 0 :(得分:0)

反思示例:

public static void Main(string[] args)
{
    Type t = typeof(string);
    Type fooType = typeof(Foo<>);
    Type genericFooType = fooType.MakeGenericType(t);
    object o = Activator.CreateInstance(genericFooType,null);
    MethodInfo method = genericFooType.GetMethod("Bar");
    method.Invoke(o, null);
}

public class Foo<T> where T:class
{
    public void Bar()
    {
        Console.WriteLine ("Calling Bar");
    }
}

答案 1 :(得分:0)

您似乎没有在TEntity类中使用LINQDynamic,而是将类型作为参数传递。这使得TEntity毫无意义。

尝试:

public class LINQDynamic
{
   public static object GetQueryResult(object pkKey,Type type, params object[] pkKeys)
   {
                 //TODO
   }
}

var test = LINQDynamic.GetQueryResult(ssa,entityType,ddd);

答案 2 :(得分:0)

之前我遇到过同样的问题。这里通常是我做的。在你的代码中保持上升到调用堆栈的位置,直到你能够描述接口发生了什么,而不是通用,即; IEnumerable GetResults(字符串项)。

然后,使用表达式树代码生成方法的内容(这允许您保持泛型方法调用),并将编译的lambda存储在静态字典中,其中键是您的&#34; item&#34;并且值是Func&lt; IEnumerable&lt; IEntity&gt;取代。

虽然轻轻踩了一下。在Web应用程序等并发和长期运行的应用程序中,很容易遇到多线程,内存泄漏和其他令人讨厌的问题。我几乎建议你不要这样做。

答案 3 :(得分:0)

Tnxs singsuyash

这对我有用;

  object[] newobj = { pkey,entityType,pKyes };
            object[] parameters = new object[] { newobj };
            Type t = typeof (string);
            Type linqType = typeof (LinqDynamic<>);
            Type genericLinqType = linqType.MakeGenericType(entityType);
            object o = Activator.CreateInstance(genericLinqType, null);
            MethodInfo method = genericLinqType.GetMethod("GetEntityByPrimaryKey");
            var results = method.Invoke(o, parameters);