Activator.CreateInstance(p.PropertyType) == value
是假的
给出类型T:
public class ODataTestHelper
{
public int DataId { get; set; }
public string DataItem { get; set; }
}
关于财产的预告:
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
。这是根据How can I call default(T) with a type?和Create default instance of type创建默认值的答案,但我似乎无法==
或.Equals
来测试相等性?
答案 0 :(得分:8)
这里简单的答案是它们是不同的对象。此上下文中的==
运算符检查两个表达式是否引用相同的对象。虽然两个对象的值可能相同,但是对象不是同一个对象,因此不相等。
要确定两个对象是否具有相同的值,您应该使用:
(<expression 1>).Equals(<expression2)
而不是<expression 1> == <expression 2>
您可能需要覆盖Equals
方法以使其在C#中工作,因为我默认情况下看到该方法检查的条件与==
相同。请参阅here。