4

Activator.CreateInstance(p.PropertyType) == value偽です

タイプ T が与えられた場合:

public class ODataTestHelper
        {
            public int DataId { get; set; }
            public string DataItem { get; set; }
        }

プロパティに対する foreach:

public string BuildQuery<T>(T searchModel,int page, int pageSize)
{
  var type=typeof(T);
  var filters = new List<string>();
  foreach (var p in type.GetProperties())
  {
    var value=p.GetValue(searchModel,null);
    if(value == null || value.ToString().IsNullOrEmpty() || (p.PropertyType.IsValueType && Activator.CreateInstance(p.PropertyType) == value ))
        continue;
     filters.Add(string.Format("{0} eq {1}", p.Name, WrapTypeValue(p.PropertyType, value)));
  }
   if (filters.Any())
        {
            result += "&$filter=" + filters.Aggregate((s1, s2) => s1 + " and ");
        }
        return result;
 }

与えられたテスト方法

[TestMethod]
        public void BuildQuery_StringProperty_ItRendersTheFilter()
        {
            const string x = "foo";
            string expected =String.Format( "&$filter={0} eq '{1}'",LinqOp.PropertyOf(() => default(ODataTestHelper).DataItem).Name , x);
            var od = new ODataBinder("http://localhost/");
            var q = od.BuildQuery(new ODataTestHelper { DataItem = x}, 0, 0);
            Assert.IsTrue(q.Contains(expected), string.Format("{0} did not contain {1}", q, expected));

        }

即時ウィンドウは、デフォルトの出力が0であり、インスタンスの値が であることを確認します0。また、p.PropertyType.IsValueType

0==への呼び出しを 行わないActivator.CreateInstance(p.PropertyType)ため、初期化されていない をスキップしませんDataIdこれは、どのように型で default(T) を呼び出すことができますか?ごとのデフォルト値を作成するための答えです。タイプのデフォルトのインスタンスを作成しますが、等しいかどうかをテスト==できないようです。.Equals

4

1 に答える 1

8

ここでの簡単な答えは、それらは異なるオブジェクトであるということです。このコンテキストの==オペレーターは、両方の式が同じオブジェクトを参照しているかどうかを確認します。2つのオブジェクトの値は同じである可能性がありますが、オブジェクトは同じオブジェクトではないため、等しくありません。

2つのオブジェクトが同じ値を持っているかどうかを確認するには、次を使用する必要があります (<expression 1>).Equals(<expression2)<expression 1> == <expression 2>

Equalsデフォルトでメソッドがと同じ条件をチェックするので、C#でこれを機能させるには、メソッドをオーバーライドする必要があるかもしれません==ここを参照してください。

于 2013-02-12T20:45:34.567 に答える