2015-10-07 149 views
0

我有一個項目在MVC C#code-first。我想將一個類型傳遞給我的方法。我的方法需要一個班才能工作。但我不想通過一門課 - 我希望它是動態的。有沒有可能?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 
     } 
    } 
+2

的可能的複製[如何使用反射來調用泛型方法?(http://stackoverflow.com/questions/232535/how-to-use-reflection-to-call-generic-method) – kai

+0

是的,可能是一樣的。但我的表名是動態的。我怎樣才能轉換或如何使用反射來創建字符串表名稱到真正的類傳遞給LINQDynamic <這裏是我想要動態類>。 –

回答

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"); 
    } 
} 
0

看來,你是不是在你的LINQDynamic類使用TEntity - 代替你傳遞類型作爲參數。這使得TEntity種沒有意義。

嘗試:

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

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

我以前遇到同樣的問題。這通常是我所做的。保持在代碼中調用堆棧的方式,直到您可以描述接口發生的事情而不是泛型,即: IEnumerable GetResults(字符串項)。

然後,代碼使用表達式樹生成方法的內容(這允許您保留泛型方法調用),並將編譯後的lambda存儲在靜態字典中,其中鍵是「item」,值是IEnumerable < IEntity>>。

雖然輕輕一點。在併發和長時間運行的應用程序(如Web應用程序)中很容易遇到多線程,內存泄漏和其他令人討厭的問題。我幾乎建議你不要這樣做。

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