Activator.CreateInstance(p.PropertyType) == value
是false
给定一个类型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
测试相等性?