C#代表& guid.newguid()

时间:2011-02-14 12:14:40

标签: c#

我今天下午刚开始使用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)); 
            ...     
    }
}

我已经删除了大部分字符串处理代码以节省一些空间。

3 个答案:

答案 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;代替。