C#, C♯, C#相談室 Part64

このエントリーをはてなブックマークに追加
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; }
}
51デフォルトの名無しさん:2011/01/18(火) 10:12:41
最適化でメンバが勝手に消えることはありません
public以外にすると消えたように見えるのは、GetMethodsがpublicメンバしか返さないからです
かわりにGetMembers(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)を使えば
publicでなくても取得できます
どうせ名前だけで判別するならforeachも必要なくて
GetMethod("InternalUse", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
の結果だけを見れば十分です
52デフォルトの名無しさん:2011/01/18(火) 11:56:58
>>50のコードってなんかいい使い道あんの?
53デフォルトの名無しさん:2011/01/18(火) 12:24:29
GetObject<T>()みたいなメソッドはオーバーロードでGetObject(Type)が用意されてるのが普通だけど
それが用意されてなくてどうしてもTypeで指定したいときは稀にあるな
基本的には動的に使われそうなメソッドはTypeを取るオーバーロードを用意しておいて
ジェネリック版の方を T GetObject<T>() { return GetObject(typeof(T)); }と実装するのが普通