gpt4 book ai didi

c# - 如果所有字段都相同,如何轻松地将结构复制到类中?

转载 作者:行者123 更新时间:2023-11-30 12:10:51 24 4
gpt4 key购买 nike

我有这样的struct

public struct InstrumentDefinition2
{
public int instrumentId;
public int Decimals;
public long MinPriceIncrement_Mantissa;
public short MinPriceIncrement_Exponent;
public long RoundLot_Mantissa;
public short RoundLot_Exponent;
public char MsgType; // 'd' - Security Definition 'f' - Security Status?
}

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void InstrumentReplayCallback(ref InstrumentDefinition2 value);

它通过委托(delegate)调用从这个 c++ 结构构造:

typedef struct _InstrumentDefinition {
int32_t instrumentId;
int32_t Decimals;
int64_t MinPriceIncrement_Mantissa;
int16_t MinPriceIncrement_Exponent;
int64_t RoundLot_Mantissa;
int16_t RoundLot_Exponent;
char MsgType; // 'd' - Security Definition 'f' - Security Status
} InstrumentDefinition;

它工作正常。我不确定是否可以将 InstrumentDefinition2 声明为 class。但我喜欢将 InstrumentDefinition2 声明为 struct,我将其视为“指向 C++ 内存块的指针”。

但是在处理过程中我需要将它复制到一个类中。所以我想声明非常相似的 C# 类:

public class InstrumentDefinition
{
public int instrumentId;
public int Decimals;
public long MinPriceIncrement_Mantissa;
public short MinPriceIncrement_Exponent;
public long RoundLot_Mantissa;
public short RoundLot_Exponent;
public char MsgType; // 'd' - Security Definition 'f' - Security Status?
}

问题是如何将 InstrumentDefinition2 结构复制到 InstrumentDefinition 类?当然,我可以一一分配所有字段,但它会:

  • 我想比较慢
  • 容易出错(如果引入新字段而我忘记添加它的“应对”怎么办?)

那么我是否可以在不处理每个字段的情况下以某种方式做到这一点?

最佳答案

如果你想通过匹配名称来复制类实例的字段或属性值,你可以使用这个片段:

public void ShallowCopyValues<T1, T2>(T1 firstObject, T2 secondObject)
{
const BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;
var firstFieldDefinitions = firstObject.GetType().GetFields(bindingFlags);
IEnumerable<FieldInfo> secondFieldDefinitions = secondObject.GetType().GetFields(bindingFlags);

foreach (var fieldDefinition in firstFieldDefinitions)
{
var matchingFieldDefinition = secondFieldDefinitions.FirstOrDefault(fd => fd.Name == fieldDefinition.Name &&
fd.FieldType == fieldDefinition.FieldType);
if (matchingFieldDefinition == null)
continue;

var value = fieldDefinition.GetValue(firstObject);
matchingFieldDefinition.SetValue(secondObject, value);
}
}

此代码使用反射来确定具有相同名称和相同类型的字段。如果找到匹配项,则在第二个对象上更新该值。此外:这段代码比一个一个地分配值要慢,但这应该无关紧要,因为通常类没有大量字段,这几乎不会造成性能损失。

认为此代码不完整。在生产代码中,我肯定会推荐像 Automapper ( https://github.com/AutoMapper/AutoMapper#readme ) 这样的库,它更加灵活和可配置,正如 simsim 所提到的。

此外,您可以通过相同的布局将 C# 类映射到 C++ 结构,如 Mathew Watson 所述。您只需将 StructLayoutAttribute 应用于类,就像 MSDN 上的示例所示:http://msdn.microsoft.com/en-us/library/795sy883.aspx重要的是 C# 中的类具有与 C++ 中的结构相同的内存布局。

关于c# - 如果所有字段都相同,如何轻松地将结构复制到类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17061720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com