当一个结构体和另一个结构体是相同的未知类型时,你能把它们复制到另一个结构体吗?
本文关键字:结构体 另一个 复制 类型 一个 未知 | 更新日期: 2023-09-27 18:15:50
这是我第一次尝试。我希望Fill()中的最后一条语句将执行逐成员复制,但实际上什么也没有发生。问题无疑是赋值中的类型在编译时是未知的。我的意图是使用一个结构体字典,按类型键,在连接单元测试。如果不向我的类中添加各种单独结构的知识,也许这是不可能做到的。
internal class TestData
{
private static Dictionary<Type, ValueType> mTestData = new Dictionary<Type, ValueType>();
internal static void Add(ValueType _testData)
{
mTestData.Add(_testData.GetType(), _testData);
}
internal static void Fill(ValueType _runtimeData)
{
ValueType testData = mTestData[_runtimeData.GetType()];
_runtimeData = testData;
}
}
您的代码中有几个错误。值类型在作为参数传递和从函数返回时被复制:
-
在
Add(ValueType _testData)
中,变量_testData
将是传递参数的ValueType
字段的副本。 -
_testData.GetType()
将始终返回typeof(ValueType)
。 -
_runtimeData = testData;
修改了局部变量_runtimeData
,但不能修改传递的参数
重新考虑使用泛型和装箱值类型。下面是对代码的修改
internal class TestData
{
private static Dictionary<Type, object> mTestData = new Dictionary<Type, object>();
internal static void Add<T>(T _testData) where T: ValueType, struct
{
mTestData.Add(typeof(T), _testData);
}
internal static void Fill<T>(ref T _runtimeData) where T: ValueType, struct
{
T testData = (T)mTestData[typeof(T)];
_runtimeData = testData;
}
}
我的工作是返回结果:
internal static ValueType Fill(ValueType _runtimeData)
{
return mTestData[_runtimeData.GetType()];
}
,并像这样命名:
parms = (NewRuleParms)TestData.Fill(parms);