我今天下午刚开始使用C#,所以请稍微温和一点。
目前我正在开发一种“模板引擎”,其中一个回调需要生成全局唯一ID。我正在使用代理来管理回调。
目前代码看起来像这样(虽然我也试过一个匿名函数&直接返回NewGuid没有变量):
static string UID(List<string> p)
{
string s = Guid.NewGuid().ToString();
return s;
}
当直接调用时,工作正常。但是,如果我尝试通过委托调用它(通过addCallback("generate UID", new CallbackWrapper(UID))
添加到StringDictionary),程序将生成相同的GUID,无论我复制它多少次;即使在&amp;之前直接调用该方法事件发生后,会产生预期的唯一ID。心中已经
毫无疑问,这只是我错过的一些简单的东西,不可避免地源于我对C#相对缺乏经验。
任何帮助都将不胜感激。
感谢。
好吧,我现在尝试使用相同结果的词典。
CallbackWrapper只是委托,它的定义如下:
delegate string CallbackWrapper(List<string> parameters);
剩下的工作是在另一个类中完成的,如下所示:
class TemplateParser
{
private Dictionary<string, CallbackWrapper> callbackMap;
public TemplateParser(string directivePrefix, string directiveSuffix)
{
...
callbackMap = new Dictionary<string,CallbackWrapper>();
}
public TemplateParser() : this("<!-- {", "} -->") {}
{
callbackMap.Add(name, callback);
}
public string parse(string filename)
{
...
string replacement =
callbackMap[directiveName](new List<string>(parameters.Split(new string[] { ";", " " }, StringSplitOptions.RemoveEmptyEntries));
...
}
}
我已经删除了大部分字符串处理代码以节省一些空间。
答案 0 :(得分:1)
问题在于您的调用代码,而不是代码本身,也不在代理中。
如果正确调用,肯定有效
此外,您的代码可以略微简化:
static string UID(List<string> p)
{
return Guid.NewGuid().ToString();
}
(变量完全是多余的。)
答案 1 :(得分:0)
使用delegate.invoke 直接函数调用和delegate.invoke之间的区别在于此处 http://social.msdn.microsoft.com/Forums/en/csharplanguage/thread/f629c34d-6523-433a-90b3-bb5d445c5587
答案 2 :(得分:0)
StringDictionary会自动将您的CallbackWrapper转换为字符串,这意味着它只会运行一次并存储CallbackWrapper.ToString()的输出。这可能不是你想要的。
尝试使用Dictionary&lt; string,CallbackWrapper&gt;代替。