0

たぶん私の質問は奇妙です...フレーズにリフレクションを使用することは可能かどうか疑問に思いました。

C#でのリフレクションと比較してみました。これまで、プロパティの名前を文字列として、値をオブジェクトとして、次のように渡していましたCmp("foo", "abc")
このようにしてfoo、クラスに既存のプロパティがあるかどうかを確認し、値の型がプロパティの種類と一致するかどうかを確認する必要があります(上記の例では、fooは文字列プロパティであり、値は文字列です)。この方法は問題なく機能します。

フレーズをパラメータとして送信し、リフレクションなどで分析できるのではないかと思います。
つまり、上記の例のように、このような関数を呼び出す代わりに、Cmp("foo", "abc")このような関数Cmp(A.foo == "abc")(プロパティAを持つクラスfoo)を呼び出すだけで、プロパティがfooであり、値がであると分析します"abc"

私はそれが奇妙に聞こえることを知っています、そしてそれは私にとって必要ではありません。そのアイデアのためだけに。
出来ますか?

編集
私が明確でなかった場合、私はCmp(string, string)メソッドを書きました、そしてそれはうまくいきます!次のようなメソッドを作成する方法
があるかどうかを知りたいだけです。パラメータがフレーズであること。CmpCmp(A.foo == "abc")

編集2
たとえば、Cでそのようなことを行うことができます。次のようなマクロを作成できます。

#define Cmp(phrase) printf(##phrase)

次に、それを次のように呼び出すとCmp(A.foo == "abc")、出力は次のようになります。

A.foo == "abc"

フレーズ全体をパラメータとして渡し、それを分析するようなものです。マクロはプリコンパイルされたものであることを知っています。C#にそのようなものがあるかどうかを知りたいだけです。

4

2 に答える 2

0

式ツリーを使用して、のような式を記述することができますbar.Foo == "abc"Barこれは、次の名前のプロパティを持つという名前のクラスがあることを前提とした簡単な例ですFoo

String FormatExpression<T>(Expression<Func<T, Boolean>> expression) {
  if (expression == null)
    throw new ArgumentNullException("expression");
  var body = expression.Body as BinaryExpression;
  if (body == null)
    throw new ArgumentException(
      "Expression body is not a binary expression.", "expression");
  return body.ToString();
}

呼び出し

FormatExpression((Bar bar) => bar.Foo == "abc")

文字列を返します

(bar.Foo == "abc")
于 2012-10-30T14:25:58.397 に答える
0

この拡張メソッドは、呼び出されたオブジェクトのすべての(読み取り可能でパブリックな)プロパティを調べ、そのプロパティで指定された名前のプロパティをチェックし、値を比較します。

public static class CmpExtension
{
    public static bool Cmp<T, TValue>(this T obj, string propertyName, TValue value)
        where TValue : class
    {
        var properties = obj.GetType().GetProperties()
                .Where(p => p.CanRead);

        foreach (var property in properties)
        {
            var propertyValue = property.GetValue(obj, null);

            var childProperty = property.PropertyType.GetProperties()
                .Where(p => p.CanRead)
                .FirstOrDefault(p => p.Name == propertyName);

            if (childProperty == null) continue;

            var childPropertyValue = childProperty.GetValue(propertyValue, null);

            return childPropertyValue == value;
        }

        return false;
    }
}

これを使用すると、次のことができます。

public class Foo
{
    public Bar Bar { get; set; }
}

public class Bar
{
    public string Value { get; set; }
}

public static void Main(string[] args)
{
    var foo = new Foo { Bar = new Bar { Value = "Testing" } };
    foo.Cmp("Value", "Testing"); // True
}

代替構文を使用するには、次を使用します。

public static class CmpExtension
{
    public static bool Cmp<T>(this T obj, Func<T, bool> func)
    {
        return func(obj);
    }
}

これを使用して、あなたはすることができます

    public static void Main(string[] args)
    {
        var foo = new Foo { Bar = new Bar { Value = "Testing" } };
        foo.Cmp(f => f.Bar.Value == "Testing"); // True
    }
于 2012-10-30T15:04:26.920 に答える