2009-07-09 11 views

答えて

5

いいえ。ただし、最初にラムダとしてメソッドを宣言すると、初期化時にそのメソッドを実行しようとしますが、メソッドを設定できます。

ただし、インターフェイスでラムダプロパティが指定されていない限り、MyMethodが宣言されているインターフェイスは実装できません。

F#にはオブジェクト式があり、lambdaからオブジェクトを作成できます。私はある時点でこれがC#の一部であることを願っています。

0

号の方法は、変数のように使用することはできません。

JavaScriptを使用していた場合は、そうすることができます。

6

Chrisは、メソッドを変数のように使うことはできません。ただし、このような何かを行うことができます。この中のMyClassを定義する場合

MyClass myObj = new MyClass(); 
myObj.TheAction = x => Console.WriteLine(x); 
myObj.DoAction(3); 

:あなたはこのコードを書くことができます

MyClass myObj = new MyClass(); 
myObj.MyAction = (x) => { Console.WriteLine(x); }; 
0

class MyClass { 
    public Action<int> MyAction = x => { throw new NotImplementedException() }; 
} 

は、アクションが上書きされるようにするにはway:

class MyClass 
{ 
    public Action<int> TheAction {get;set;} 

    public void DoAction(int x) 
    { 
    if (TheAction != null) 
    { 
     TheAction(x); 
    } 
    } 
} 

Buあまりにも驚くべきではないはずです。

0

直接的ではありませんが、コードは少しあります。

public class MyBase 
{ 
    public virtual int Convert(string s) 
    { 
     return System.Convert.ToInt32(s); 
    } 
} 

public class Derived : MyBase 
{ 
    public Func<string, int> ConvertFunc { get; set; } 

    public override int Convert(string s) 
    { 
     if (ConvertFunc != null) 
      return ConvertFunc(s); 

     return base.Convert(s); 
    } 
} 

その後、あなたは何をしたいのかに応じて、コード

Derived d = new Derived(); 
int resultBase = d.Convert("1234"); 
d.ConvertFunc = (o) => { return -1 * Convert.ToInt32(o); }; 
int resultCustom = d.Convert("1234"); 
+0

私はConvertFuncをパブリックプロパティとして持っていません。上記のコードはイラストだけです。 –

0

を持っている可能性があり、この問題を解決するための多くの方法があります。

良い出発点は、gettableとsettableであるデリゲート(例えばAction)プロパティを作ることです。その後、そのアクションプロパティに委譲するメソッドを持つことも、単にクライアントコードで直接呼び出すこともできます。これは、アクションプロパティをプライベートセット可能にする(多分それを設定するコンストラクタを提供する)など、他の多くのオプションを開く。

などのEg.

class Program 
{ 
    static void Main(string[] args) 
    { 
     Foo myfoo = new Foo(); 
     myfoo.MethodCall(); 

     myfoo.DelegateAction =() => Console.WriteLine("Do something."); 
     myfoo.MethodCall(); 
     myfoo.DelegateAction(); 
    } 
} 

public class Foo 
{ 
    public void MethodCall() 
    { 
     if (this.DelegateAction != null) 
     { 
      this.DelegateAction(); 
     } 
    } 

    public Action DelegateAction { get; set; } 
} 
関連する問題