【问题标题】:How can I change these codes to C#.net framework 3.5?如何将这些代码更改为 C#.net framework 3.5?
【发布时间】:2013-06-03 06:00:21
【问题描述】:

这是.net framework 4.0的代码。 但是我们的旧系统使用的是 3.5。很难升级所有代码。 我想知道怎么把4.0写的代码改成3.5的代码。

主要问题是我不知道如何转换 "return string.Join(",", states);" 当我尝试使用 .net framework 3.5 编译它时发生错误。

谢谢!

public enum States
{
....
}

public static string GetStates(uint stateFlags)
{
    var stateList = Enum.GetValues(typeof(States));
    var states = default(States);

    foreach (var state in stateList)
    {
        if (state == null) continue;
        var stateEnum = (States)state;
        if (HasState(stateFlags, stateEnum))
        {
            states = states | stateEnum;
        }
    }

    return string.Join(",", states);
}

错误是 错误 'string.Join(string, string[])' 的最佳重载方法匹配有一些无效参数

【问题讨论】:

  • 您应该始终准确说明发生了什么错误——只需将其复制并粘贴到问题中即可。
  • 感谢您的评论。错误是“'string.Join(string, string[])' 的最佳重载方法匹配有一些无效参数”。
  • 该代码看起来在 .Net 4 中会出现同样的错误,所以我不知道您在期待什么。
  • states is an enum no .net version接受String.Join()中的枚举

标签: c#


【解决方案1】:

.Net 3.5 中的string.Join 仅支持字符串数组,而 .Net 4.0 有额外的重载可用于IEnumerable<string> 或Object[]。

您应该将string[] 传递给Join 方法。

MSDN 文档中的更多信息:

.Net 4: http://msdn.microsoft.com/en-us/library/dd992421(v=vs.100).aspx

.Net 3.5: http://msdn.microsoft.com/en-us/library/57a79xd0(v=vs.90).aspx

【讨论】:

  • 在上面的示例中,变量“states”的类型是“States”,所以上面没有 ToArray 扩展方法...
  • 谢谢!我试过了,但它无法编译。错误是:“'States' 不包含'ToArray' 的定义,并且找不到接受'States' 类型的第一个参数的扩展方法'ToArray'(您是否缺少 using 指令或程序集引用?)”
【解决方案2】:

这是原始解决方案的略微修改版本

public enum States
{
    None = 0,
    StateOne = 1,
    StateTwo = 2,
    StateThree = 4,
    StateFour = 8,
};

public static string GetStates(uint stateFlags)
{
    var stateList = Enum.GetValues(typeof(States));
    List<States> states = new List<States>();

    foreach (int state in stateList)
    {        
        if ((stateFlags & state) != 0)
        {
            states.Add((States)state);
        }
    }

    return string.Join(",", states);
}

跑步

GetStates((uint)(States.StateOne | States.StateTwo))

输出

StateOne,StateTwo

【讨论】:

    【解决方案3】:

    在 .Net 3.5 中,您用于“String.Join”的重载不可用。 将您的返回行替换为以下 2 行:

     string[] stateNames = Enum.GetNames(typeof(States));
     return string.Join(",", stateNames);
    

    预期的第二个参数是一个字符串数组。

    【讨论】:

    • 非常感谢!你的意思是下面的代码现在已经使用了吗? foreach (var state in stateList) { if (state == null) continue; var stateEnum = (States)state; if (HasState(stateFlags, stateEnum)) { states = states |状态枚举; } }
    • @user1836330:我不确定您所说的“下面的代码现在已经使用”是什么意思。您是在问该功能是否需要工作?
    【解决方案4】:

    感谢大家的热情帮助。 我将最后一行更改为以下内容:

            var valuesAsList = GetValues(states).Cast<string>().ToList();
    
            return string.Join(",", valuesAsList.ToArray());
    

    并添加方法:

        public static IEnumerable<Enum> GetValues(Enum enumeration)
        {
            List<Enum> enumerations = new List<Enum>();
            foreach (FieldInfo fieldInfo in enumeration.GetType().GetFields(BindingFlags.Static | BindingFlags.Public))
            {
                enumerations.Add((Enum)fieldInfo.GetValue(enumeration));
            }
            return enumerations;
        }
    

    编译错误消失了,但是我还没有测试代码看它是否与.net 4.0的结果相同。

    再次感谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-22
      • 2010-09-14
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      • 2013-08-19
      • 1970-01-01
      • 2013-04-08
      相关资源
      最近更新 更多