7

CallMe<T>()class内の静的メソッドにアクセスする方法を理解しようとしていますDoSomething。ここでの唯一の解決策はリフレクションですか?タイプ のオブジェクトをインスタンス化したくありませんMyAction。また、リフレクションを介して行う場合、メソッド内でリフレクションを介してメソッドを作成し、CallMe<T>()それを何度も呼び出して同じ「反映された」メソッドで複数の操作を実行する方法はありますか? それとも、反省するよりも良い方法はありますか? 私は基本的に、その義務MyActionをどのように実行するかを定義するようなテンプレート実装スタイル クラスを作成したいと考えています。byte[] DoThis(string text)次にAskForSomething()、 はどのテンプレートが使用されているかを指定し、それに従って がCallMe<T>()作業を進めます。

    public class AskSomething
    {
        public void AskForSomething()
        {
            DoSomething doSomething = new DoSomething();
            doSomething.CallMe<MyAction>();
        }
    }

    public class DoSomething
    {
        public void CallMe<T>()
        {
            Type type = typeof(T);

            //Question: How can I access 'DoThis(string text)' here?
            //Most likely by reflection? 
        }
    }

    public class MyAction
    {
        public static byte[] DoThis(string text)
        {
            byte[] ret = new byte[0]; //mock just to denote something is done and out comes a byte array

            return ret;
        }
    }
4

4 に答える 4

9

でインターフェイスを定義しDoThis、それを実装して、型パラメーターをそのインスタンスになるようにMyAction制約しますTwhere T : IMyInterface

于 2012-12-21T12:30:45.413 に答える
2

DoThisメソッドを静的にする必要がある場合は、CallMeメソッドを次のように変更することもできます。

public void CallMe(Func<string, byte[]> action)
{
    byte[] result = action("input");
}

これで、関数への参照を次のCallMeようにメソッドに渡すことができます。

 doSomething.CallMe(MyAction.DoThis);
于 2012-12-21T12:35:57.373 に答える
1

「DoThis」が静的である必要がないという事実に基づいて、次の方法でこれを実現できます。

using System;

namespace ConsoleApplication3
{
class Program
{
    static void Main(string[] args)
    {
        DoSomething doSomething = new DoSomething();
        doSomething.CallMe<MyAction>();

    }
}
public class DoSomething
{
    public void CallMe<T>() where T : IMyAction
    {
       IMyAction action =  (IMyAction)Activator.CreateInstance(typeof(T));

       var result = action.DoThis("value");            
    }
}

public interface IMyAction
{
    byte[] DoThis(string text);
}

public class MyAction : IMyAction
{
    public byte[] DoThis(string text)
    {
        byte[] ret = new byte[0]; //mock just to denote something is done and out comes a byte array

        return ret;
    }
}
}

このアプローチをお勧めするかどうかはわかりませんが、うまくいきます!(たとえば、デフォルトのコンストラクターがない場合、これは失敗します)。

于 2012-12-21T15:11:29.137 に答える
0
  public class DoSomething
  {
    class Cache<T>
    {
      public readonly static Func<string, byte[]> action = (Func<string, byte[]>)Delegate.CreateDelegate(typeof(Func<string, byte[]>), typeof(T).GetMethod("DoThis"));
    }
    public void CallMe<T>()
    {
      Cache<T>.action("text");
    }
  }
于 2012-12-21T13:07:38.083 に答える