如何一次分配给所有类数据成员

本文关键字:数据成员 何一次 分配 | 更新日期: 2023-09-27 18:19:34

在Dapper ORM应用程序中,我希望一次将一个对象分配给另一个对象,或者将所有数据成员分配给其他对象。像这样:

public class TableA
{
    public int    UserId   { get; set; }
    public string ClientId { get; set; }
    // ... more fields ...
    public bool Query()
    {
        bool Ok = false;
        try{
            // Method A
            TableA Rec = QueryResultRecords.First(); 
            MyCopyRec(Rec, this);                        // ugly
            // Method B
            this = QueryResultRecords.First();           // avoids CopyRec, does not work
            Ok = true;
        }
        catch(Exception e){
            Ok = false;
        }
        return Ok;
    }
}

使用方法A,您可以将.First()中的对象直接分配给class TableA的新对象,并且需要自定义方法MyCopyRec来获取同一类的数据成员中的数据。

但是,使用方法B,不能将同一对象直接指定给this

或者有其他方法可以做到这一点吗?

如何一次分配给所有类数据成员

如果"this"是引用类型,例如类,则不能将对象分配给"this"。"this"是指向当前类实例的指针。只有当这是一个值类型(例如结构)时,这才会起作用。

您只能将值分配给"this"的属性(这可能是(CopyRec方法中发生的情况),如:

var result = QueryResultRecords.First();
this.UserId  = result.UserId;
/// <summary>
/// Extension for 'Object' that copies the properties to a destination object.
/// </summary>
/// <param name="source">The source.</param>
/// <param name="destination">The destination.</param>
public static void CopyProperties(this object source, object destination)
{
    // If any this null throw an exception
    if (source == null || destination == null)
        throw new ArgumentException("Source or/and Destination Objects are null");
    // Getting the Types of the objects
    Type typeDest = destination.GetType();
    Type typeSrc = source.GetType();
    // Iterate the Properties of the source instance and  
    // populate them from their desination counterparts  
    PropertyInfo[] srcProps = typeSrc.GetProperties();
    foreach (PropertyInfo srcProp in srcProps)
    {
        if (!srcProp.CanRead)
        {
            continue;
        }
        PropertyInfo targetProperty = typeDest.GetProperty(srcProp.Name);
        if (targetProperty == null)
        {
            continue;
        }
        if (!targetProperty.CanWrite)
        {
            continue;
        }
        if ((targetProperty.GetSetMethod().Attributes & MethodAttributes.Static) != 0)
        {
            continue;
        }
        if (!targetProperty.PropertyType.IsAssignableFrom(srcProp.PropertyType))
        {
            continue;
        }
        // Passed all tests, lets set the value
        targetProperty.SetValue(destination, srcProp.GetValue(source, null), null);
    }
}

这是我在上面的评论中谈到的方法。

另请参阅此链接:是否自动将属性值从一个对象应用到另一个相同类型的对象?