50 :
デフォルトの名無しさん:
以下のコードの Class2.InternalUse を public 以外にすると状態により消失したり出現したりします
オプティマイズが原因だと思われますが、このInternalUseは可能なら public にしたくない。
常に出現させる事は果たして可能なのでしょうか?オプティマイズ禁止アトリビュートとか知っている人いませんか?
public static void Test()
{
Func<object, bool> f = Class2.GetMethod(typeof(int));
f(10);
}
public static class Class2
{
// ジェネリック関数 InternalUse の型引数をType型オブジェクトで引き渡そうという試み
public static Func<object, bool> GetMethod(Type type)
{
foreach (System.Reflection.MethodInfo item in typeof(Class2).GetMethods())
{
if (item.Name == "InternalUse")
{
System.Reflection.MethodInfo method = item.MakeGenericMethod(type);
return (arg) => (bool)method.Invoke(null, new object[] { arg });
}
}
System.Diagnostics.Debug.Assert(false, "InternalUse<T> が消失");
return null;
}
// 型引数をType型で渡したいジェネリック関数
//private static bool InternalUse<T>(T arg) { System.Console.WriteLine(arg); return true; }
public static bool InternalUse<T>(T arg) { System.Console.WriteLine(arg); return true; }
}
最適化でメンバが勝手に消えることはありません
public以外にすると消えたように見えるのは、GetMethodsがpublicメンバしか返さないからです
かわりにGetMembers(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)を使えば
publicでなくても取得できます
どうせ名前だけで判別するならforeachも必要なくて
GetMethod("InternalUse", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
の結果だけを見れば十分です
GetObject<T>()みたいなメソッドはオーバーロードでGetObject(Type)が用意されてるのが普通だけど
それが用意されてなくてどうしてもTypeで指定したいときは稀にあるな
基本的には動的に使われそうなメソッドはTypeを取るオーバーロードを用意しておいて
ジェネリック版の方を T GetObject<T>() { return GetObject(typeof(T)); }と実装するのが普通