【发布时间】:2014-03-03 16:23:04
【问题描述】:
我正在构建一个单元测试列表,这些单元测试被组织为一个对象列表,每个对象都包含要作为 Func 执行的测试方法。每个对象都有一个在 Func 范围内并被它使用的变量。该变量不作为参数传入。
遍历列表并运行所有测试运行良好,但是否可以从一个对象复制 Func,-破坏对该对象的引用-,并将其分配给一个新对象?我认为这可以通过创建深层副本以某种方式实现,但我使用 BinaryFormatter 的尝试没有奏效,任何提示将不胜感激!
我有一个简化的表单应用程序如下来说明我的问题:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing; using
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks; using System.Windows.Forms;
namespace WindowsFormsApplication4 {
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public static object DeepClone(object obj)
{
object objResult = null;
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, obj);
ms.Position = 0;
objResult = bf.Deserialize(ms);
}
return objResult;
}
[Serializable]
public class POCOwithFunc {
public POCOwithFunc(Func<string> myfunc)
{
mqi = myfunc;
}
public POCOwithFunc() { }
public Func<string> mqi;
public object parm;
}
private void button1_Click(object sender, EventArgs e)
{
List<POCOwithFunc> testList = new List<POCOwithFunc>();
for (int x = 0; x < 5; x++)
{
var pc = new POCOwithFunc();
pc.parm = x;
pc.mqi = delegate()
{
var rrq = pc.parm;
return "result: " + pc.parm;
};
testList.Add(pc);
}
String output = "";
foreach (var test in testList)
{
output += test.mqi() + "\r\n";
}
//output:
//result: 0
//result: 1
//result: 2
//result: 3
//result: 4
var pocoToBeCopied = testList[2];
var newpoco = new POCOwithFunc();
newpoco.parm = 10;
newpoco.mqi = pocoToBeCopied.mqi;
var res = newpoco.mqi(); //returns 2
newpoco = (POCOwithFunc)DeepClone(pocoToBeCopied); //fails
}
} }
【问题讨论】:
-
当您说“它不起作用”时,究竟发生了什么?你收到错误信息了吗?那是什么?
-
我会试试 iCloneable
-
@Alex 看看它说什么 .... 未标记为可序列化.
-
如果您正在深度克隆
Func<string>,这是否意味着您正试图在Func<string>中保留某些状态?Func<string>在设计上不应该是无状态的吗? -
@RobertHarvey 我想保留对函数的封闭/外部对象中的变量的引用,而不是该变量的特定值。