C# 如何在C中比较ViewModel的两个实例的值相等性#

C# 如何在C中比较ViewModel的两个实例的值相等性#,c#,asp.net-mvc,C#,Asp.net Mvc,因此,我有一个用于搜索数据库的ViewModel。我打算重构掉结果集集合。我认为它不属于这个视图模型。我只想在用户提交页面时将传递给我的控制器操作的ViewModel与存储在TempData中的ViewModel进行比较。所以我可以判断这是否是相同的研究 那怎么能做到呢?考虑到我的viewModel中有很多属性,我不想逐一比较。在我看来,使用Json.Encode对它们进行序列化并进行比较似乎是“黑客行为” 还有,如果我必须逐一比较的话。应该通过重写.Equals() 控制器操作Search()

因此,我有一个用于搜索数据库的ViewModel。我打算重构掉结果集集合。我认为它不属于这个视图模型。我只想在用户提交页面时将传递给我的控制器操作的ViewModel与存储在TempData中的ViewModel进行比较。所以我可以判断这是否是相同的研究

那怎么能做到呢?考虑到我的viewModel中有很多属性,我不想逐一比较。在我看来,使用Json.Encode对它们进行序列化并进行比较似乎是“黑客行为”

还有,如果我必须逐一比较的话。应该通过重写
.Equals()

控制器操作
Search()
ViewModel
SearchViewModel
公共类SearchViewModel
{
公共搜索视图模型()
{
Page=1;
BuildingSearch=新建搜索BuildingViewModel();
ParcelSearch=新搜索ParcelViewModel();
SalesSearch=新的SearchSalesViewModel();
PropertyFeatureSearch=新搜索PropertyFeaturesViewModel();
ValuesSearch=新的搜索值viewmodel();
} 
/// 
///获取或设置一个值,该值指示是否使用高级搜索。
/// 
公共bool UseAdvancedSearch{get;set;}
公共布尔新闻搜索{get;set;}
公共布尔isSameSearch{get;set;}
/// 
///获取或设置页面。
/// 
[HiddenInput]
[脚手架立柱(假)]
公共整型页{get;set;}
[HiddenInput]
[脚手架立柱(假)]
公共字符串排序选项{get;set;}
#区域搜索视图模型
/// 
///获取或设置建筑搜索。
/// 
公共搜索BuildingViewModelBuildingSearch{get;set;}
/// 
///获取或设置地块搜索。
/// 
公共搜索ParcelViewModel ParcelSearch{get;set;}
/// 
///获取或设置属性功能搜索。
/// 
公共搜索属性功能查看模型属性功能搜索{get;set;}
/// 
///获取或设置销售搜索。
/// 
公共搜索SalesViewModel SalesSearch{get;set;}
/// 
///获取或设置搜索值。
/// 
公共搜索值查看模型值搜索{get;set;}
#端区
/// 
///获取或设置搜索结果。
/// 
[脚手架立柱(假)]
公共IPagination搜索结果{get;set;}
}

考虑使用它对对象进行深入比较。您甚至可以使用NuGet获取它:

在ViewModel中实现
IEquatable
,其中T是ViewModel类名,并创建自己的Equals方法逻辑:

public bool Equals(ViewModel other)
{
    //compare properties, etc here
}
并重写GetHashCode():


重写.Equals()并使用反射,否则在添加新成员时,您将不得不保持超负荷。我只是有点呕吐。反射很可怕,但有时是需要的。。。它的存在是有原因的,不仅仅是因为EF使用它。你能在回答中给出一个小例子吗?我已经有一段时间没有做过这样的编码了。这真的很有帮助。
public class SearchViewModel
{

    public SearchViewModel()
    {
        Page = 1;
        BuildingSearch = new SearchBuildingViewModel();
        ParcelSearch = new SearchParcelViewModel();
        SalesSearch = new SearchSalesViewModel();
        PropertyFeatureSearch = new SearchPropertyFeaturesViewModel();
        ValuesSearch = new SearchValuesViewModel();
    } 

    /// <summary>
    /// Gets or sets a value indicating whether use advanced search.
    /// </summary>
    public bool UseAdvancedSearch { get; set; }
    public bool NewSearch { get; set; }
    public bool isSameSearch { get; set; }
    /// <summary>
    /// Gets or sets the page.
    /// </summary>
    [HiddenInput]
    [ScaffoldColumn(false)]
    public int Page { get; set; }

    [HiddenInput]
    [ScaffoldColumn(false)]
    public string SortOption { get; set; }

    #region Search View Models

    /// <summary>
    /// Gets or sets the building search.
    /// </summary>
    public SearchBuildingViewModel BuildingSearch { get; set; }

    /// <summary>
    /// Gets or sets the parcel search.
    /// </summary>
    public SearchParcelViewModel ParcelSearch { get; set; }

    /// <summary>
    /// Gets or sets the property feature search.
    /// </summary>
    public SearchPropertyFeaturesViewModel PropertyFeatureSearch { get; set; }

    /// <summary>
    /// Gets or sets the sales search.
    /// </summary>
    public SearchSalesViewModel SalesSearch { get; set; }

    /// <summary>
    /// Gets or sets the values search.
    /// </summary>
    public SearchValuesViewModel ValuesSearch { get; set; }

    #endregion

    /// <summary>
    /// Gets or sets the search results.
    /// </summary>
    [ScaffoldColumn(false)]
    public IPagination<ParcelResultItemViewModel> SearchResults { get; set; }
}
public bool Equals(ViewModel other)
{
    //compare properties, etc here
}
public override int GetHashCode()
{
    //you custom hash code algorithm
}