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)
所以它不会跳过 unintiailized DataId
。这是根据How can I call default(T) with a type?创建默认值的答案?并创建类型的默认实例,但我似乎无法==
或.Equals
无法测试是否相等?