[英]How can I get the type I want?
我的項目中a lot
這樣的類(非常老而穩定的代碼,我無法對其進行太多更改,也許稍作更改就可以了 )
public class MyEntity
{
public long ID { get; set; }
public string Name { get; set; }
public decimal Salary { get; set; }
public static GetMyEntity ( long ID )
{
MyEntity e = new MyEntity();
// load data from DB and bind to this instance
return e;
}
}
由於某些原因,現在我需要這樣做:
Type t = Type.GetType("XXX"); // XXX is one of the above classes' name
MethodInfo staticM= t.GetMethods(BindingFlags.Public | BindingFlags.Static).FirstOrDefault();// I'm sure I can get the correct one
var o = staticM.Invoke(...); //returns a object, but I want the type above!
如果我在一開始通過“ MyEntity”,我希望我可以成為MyEntity! 請注意 ,我只知道“班級名稱”。 MyEntity e = staticM.Invoke(...) as MyEntity;
不能在這里使用。
編輯
我正在嘗試用表達式來解決它。
ParameterExpression[] parameterExps = (from p in staticM.GetParameters()
select Expression.Parameter(p.ParameterType, p.Name)).ToArray();
MethodCallExpression methodCallExp = Expression.Call(staticM, parameterExps);
BlockExpression blockExpression = Expression.Block(methodCallExp);
LambdaExpression lambdaExp = Expression.Lambda(blockExpression, parameterExps);
var d = lambdaExp.Compile() as Func<XX1,XX2>;
在示例MyEntity中,XX1將是long,XX2將是MyEntity,但是如何編寫它以適合其他情況?
由於沒有解決方案,因此我將繼續使用反射操作返回對象...
一旦對象退還,您將如何處理?
如果校准代碼知道它是什么,則可以將其轉換為該代碼。
確實,您在這里渴望接口 ,因為可以使用已知接口來返回,然后可以調用適當的方法。
有沒有辦法讓編譯時間(從用戶輸入例如)檢查,如果是動態生成你的字符串“XXX”,因此沒有辦法有o
是什么,但object
。
但是,如果這是一個硬編碼的字符串,或者如果您另外知道 compile-type的類型,則可以進行強制轉換:
var o = (XXX)staticM.Invoke(...);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.