好了,你可以創建一個編譯器上即時,像這樣:
string getTypeHack = @"using System; public static class TypeHacker {{ public static Type GetThisType() {{ return typeof({0}); }} }}";
CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateInMemory = true;
parameters.GenerateExecutable = false;
CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, string.Format(getTypeHack, "int"));
Type hacker = results.CompiledAssembly.GetType("TypeHacker");
MethodInfo hack = hacker.GetMethod("GetThisType");
Type actualType = (Type)hack.Invoke(null, null);
...但是這可能是一個非常糟糕的主意。對於您正在測試的每種類型,您都需要一個新的內存中組件。一些問題脫離了我的頭頂:
- 你將有上面的代碼的內存泄漏城市;你需要減輕這一點。
- 這會很慢。
- 這是醜陋的。
- 您仍然可能有組裝問題,具體取決於您允許的類型。
(我可能真的downvote自己的建議此...):^)
有什麼辦法來重構傳遞一個類型的應用程序?它會讓你的生活變得更加輕鬆。
哇,謝謝!有用!我想我會緩存結果,如果我使用你的解決方案 –
好吧,只是看你的記憶。緩存你所能做的事,儘快處理任何可以隨意使用的東西,併爲像「int」,「string」等低懸的水果創建查找表。如果你想到重構的道路,或者包括Jon這樣的程序集提到,這將全面變得更好。 –