有沒有辦法從Mono.Cecil中的TypeReference轉到Type?Mono.Cecil類型引用類型?
18
A
回答
20
就「盒子裏的東西」而言,只能使用ModuleDefinition.Import
API。
要從TypeReference
變爲System.Type
,您需要使用Reflection和AssemblyQualifiedName
手動查找它。請注意,塞西爾使用IL約定來逃避嵌套類等,所以你需要應用一些手動更正。
如果你只想解決非泛型,非嵌套類型,你應該沒問題。
要從TypeReference
去TypeDefition
(如果那是你的意思),你需要到TypeReference.Resolve();
請求的代碼示例:
TypeReference tr = ...
Type.GetType(tr.FullName + ", " + tr.Module.Assembly.FullName);
// will look up in all assemnblies loaded into the current appDomain and fire the AppDomain.Resolve event if no Type could be found
反射中所用的約定解釋here ,對於Cecil約定,請參閱Cecil源代碼。
2
泛型類型,你需要這樣的事:
public static Type GetMonoType(this TypeReference type)
{
return Type.GetType(type.GetReflectionName(), true);
}
private static string GetReflectionName(this TypeReference type)
{
if (type.IsGenericInstance)
{
var genericInstance = (GenericInstanceType)type;
return string.Format("{0}.{1}[{2}]", genericInstance.Namespace, type.Name, String.Join(",", genericInstance.GenericArguments.Select(p => p.GetReflectionName()).ToArray()));
}
return type.FullName;
}
請注意,這個代碼不處理嵌套類型,請@JohannesRudolph回答這個
相關問題
- 1. Mono.Cecil實例化動態創建類型
- 2. 引用類型
- 3. 引用類型
- 4. c#值類型和引用類型
- 5. 類型不能用作索引類型
- 6. 引用類型.NET中的值類型
- 7. 是可空類型的引用類型?
- 8. 引用類型與值類型
- 9. 值類型字段是引用類型?
- 10. C# - 引用類型引用另一個引用類型
- 11. 確定類型是引用類型還是值類型
- 12. StreamWriter引用類型
- 13. F#引用類型
- 14. 自引用索引類型
- 15. 將C#引用類型克隆到派生引用類型
- 16. 通用類型自引用類型的Java子類問題
- 17. 原始類型。引用泛型類型,應參數
- 18. 如何確定值類型的大小使用Mono.Cecil
- 19. 使用Mono.Cecil查找類型層次結構程序集
- 20. 如何分配引用類型類中的值類型屬性?
- 21. 結構和類/值類型與引用類型
- 22. 引用類型在VB.NET中的行爲類似於值類型
- 23. 靜態類是引用類型還是值類型?
- 24. rails生成模型引用類型
- 25. 泛型 - 獲取引用類型
- 26. 泛型類型的引用對方
- 27. Java泛型 - 超類型引用
- 28. 引用泛型類型中的屬性?
- 29. 克隆引用類型
- 30. 自定義引用類型
還要注意的是Mono.Cecil能未建通過System.Reflection(作爲一個獨立的庫),這意味着沒有直接的方法將它們轉換爲對方。你應該仍然能夠做到這一點,但它不會看起來不錯。 – ShdNx 2010-11-15 13:07:07
那麼如何用反射來查找類型?你有一個反射嵌套類型和cecil嵌套類型的例子嗎? – Will 2010-11-15 15:57:02
而不是手動添加「,」,您可以使用Assembly.CreateQualifiedName(tr.Module.Assembly.FullName,tr.FullName)。 – user276648 2012-05-29 08:59:30