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