我正在构建一个使用.dll与盒子通信的应用程序。将盒子视为黑盒子,你需要知道的是我可以使用dll函数和引用访问盒子的内存。
现在,我的应用程序需要一个字典(我考虑用数组替换,如果需要),它将包含位于盒子内存中的结构。我需要使用ref将一个结构从集合传递给框,然后该框将更新结构的数据。问题是我不能直接从集合中传递一个条目,因为它是一个动态成员。
我考虑过从集合中传递一个元素作为本地成员,它将作为ref传递,并且在框更新后,我将根据需要更新自己的结构,但我宁愿将ref传递给结构直接。< / p>
如何直接将ref传递给collectiin中的元素?
答案 0 :(得分:1)
无需使用ref
,只需正常传递您的Dictionary<TKey, TValue>
,因为它本身就是一种参考类型,您的框所做的任何修改都会在之后的字典中反映出来!
e.g。
myBox.DoStuffWith(myDictionary);
// changes to a particular value in dictionary will be accessible, e.g.
Console.WriteLine(((StructType)myDictionary[myKey].Value).Member);
更新:
跟着你发表评论:
函数如下所示:UpdateMessage(ref message)
你可以这样:
Message msg = myDictionary[id];
UpdateMessage(ref msg);
myDictionary[id] = msg
UPDATE2:
你说你想避免这种情况。 Extension methods是专门设计的,当你无法控制Type(DLL上有一个Update(),我们称之为MessageUpdater),所以你可以把上面的内容包装成一个:
class MessageExtensions
{
public static Message Update(this MessageUpdater updater, Dictionary<int,Message> dict, int key)
{
Message value = dict[key];
MessageUpdater.Update(ref value);
return dict[key];
}
}
然后你所要做的就是:
Message updatedMessage = myMessageUpdater.Update(myDict, key);
这可以接受吗?
答案 1 :(得分:1)
我自己想过一个解决方案..我的解决方案是使用一个结构数组而不是一个字典..我已经失去了一些功能,但它是我可以忍受的东西。我可以自己编写函数,从字典中为我提供我想要的函数。
这样的事情:
MessageStruct[] messages = new MessageStruct[64];
messages[0] = new MessageStruct();
UpdateMessage(ref messages[0]);
Console.writeline(message[0]);
另一个解决方案是Lasse V. Karlsen提供的......
答案 2 :(得分:1)
我建议定义一个简单的类:
public class ExposedFieldHolder<T>
{
public T Value;
public ExposedFieldHolder(T val) { Value = val; }
}
然后使用Dictionary<TKey, ExposedFieldHolder<MessageStruct>>
。在向字典中添加内容时,您必须创建一个包含相应值的new ExposedFieldHolder<MessageStruct>
,但要修改字典中的内容,您将能够:
UpdateMessage(ref theDictionary[theKey].Value);
并在适当的位置进行更新。请注意,此技术还允许使用Interlocked.CompareExchange
之类的内容以及存储在字典中包装器中的Int32
等基元。