0
public class Tomato
{}
public class Potato
{}
public class UIPotatoBinding(Expression<Func<object>> expression)
{
    // What to put here to make sure lambda results in Potato(s)
}     
public class UITomatoBinding(Expression<Func<object>> expression)
{
    // What code do I need to put here to determine if the lambda expression being passed in
    // results in Tomato, List<Tomato>, IEnumerable<Tomato>, ObservableCollection<Tomato>
    // TomatoCollection, or some other Tomato related Linq construct.
}

このラムダのものは、まだ私にはなじみがありません。他の場所ですでに回答されている明らかなことを尋ねている場合は、お詫び申し上げます。

4

2 に答える 2

3

あなたのコメントに応えて

I need to be able to handle List<Tomato>, IEnumerable<Tomato>, ObservableCollection<Tomato>, Tomato, TomatoCollection

それらの最初の 3 つ (およびおそらく最後の 1 つ) は で再開できますIEnumerable<Tomato>

これらで返されるラムダを混合してもほとんど意味がTomatoありません。おそらく、オーバーロードされたメソッドの方が適しているでしょう。

そう:

 public class MyProduce(Func<IEnumerable<Tomato>> expression)   // No need to make it an expression, so you allow for an already compiled lambda to be used.

追加したい場合Tomato

 public class MyProduce(Func<Tomato> expression) {
      Func<IEnumerable<Tomato>> expression2 = () => ( new Tomato[] { expression() });
      // Here you use expression2 as in the previous constructor.
 }

ミックスに追加Potatoする場合は、クラスをジェネリックにするか、両方のクラスに共通のスーパークラス/インターフェイスを作成します。

肝心なのは、前提条件をより強くすることです。

コードが何かを受け取ることを許可すると、何を扱っているかについて有効な仮定を立てることができなくなり、コードは多くのスパゲッティになってしまいます。のパスを許可しobject、コードがそれを処理することを期待することは、言語が提供する機能を使用することを禁じています (Javascript で書くことは価値があります)。

于 2013-11-15T14:49:19.253 に答える
2

これは、あなたが望むことをする例です。linqpad がある場合は、linqpad で実行されます。

void Main()
{
    Expression<Func<object>> f = () => new Potato();
    Helper.MyProduce(f);
}


public class Tomato 
{}
public class Potato
{}

public static class Helper
{
    public static void MyProduce(Expression<Func<object>> expression)
    {
        var func = expression.Compile();
        var result = func();

        if(result is Tomato)
            Console.Write("Tomato");
        else if (result is Potato)
            Console.Write("Potato");
        else
            Console.Write("Unknown");
    }
}
于 2013-11-15T02:26:34.547 に答える