为什么不是0 == 0?

Mas*_*low 4 c# system.reflection

Activator.CreateInstance(p.PropertyType) == value 是假的

给定类型T:

public class ODataTestHelper
        {
            public int DataId { get; set; }
            public string DataItem { get; set; }
        }
Run Code Online (Sandbox Code Playgroud)

和物业的一个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;
 }
Run Code Online (Sandbox Code Playgroud)

给出一种测试方法

[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));

        }
Run Code Online (Sandbox Code Playgroud)

即时窗口确认默认出现的是0实例中的值0.它也证实了这一点p.PropertyType.IsValueType

0没有==打电话 Activator.CreateInstance(p.PropertyType)所以它不会跳过unintiailized DataId.这是创建默认值的答案如何使用类型调用默认值(T)?创建类型的默认实例,但我似乎无法==.Equals测试相等?

Phi*_*ing 8

这里简单的答案是它们是不同的对象.==此上下文中的运算符检查两个表达式是否引用相同的对象.虽然两个对象的值可能相同,但是对象不是同一个对象,因此不相等.

要确定两个对象是否具有相同的值,您应该使用: (<expression 1>).Equals(<expression2) 而不是<expression 1> == <expression 2>

您可能需要覆盖该Equals方法以使其在C#中工作,因为我默认情况下看到该方法检查的条件与此相同==.看到这里.