C# 如何在NET3.5中为枚举值设置TryParse?

C# 如何在NET3.5中为枚举值设置TryParse?,c#,.net,enums,C#,.net,Enums,我必须使用.NET3.5,但我想使用我知道属于.NET4.0的TryParse方法。 然后我在网上搜索这个主题,我想我在[Simon Mourier的答案]()中找到了最好的解决方案 所以我创建了一个我自己的类,如下所示 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Globalization; namespace MyClasses {

我必须使用.NET3.5,但我想使用我知道属于.NET4.0的TryParse方法。 然后我在网上搜索这个主题,我想我在[Simon Mourier的答案]()中找到了最好的解决方案

所以我创建了一个我自己的类,如下所示

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace MyClasses
{

    public class MyEnum
    {
    // here goes all of Simons's code
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MyClasses;

namespace MyEnumerations
{
    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("Type in a name: ");
            string userValue = Console.ReadLine();

            MyEnumeration myValue;

            if (MyEnum.EnumTryParse(myValue,userValue, out myValue))
            {
                switch (myValue)
                {
                    case MyEnumeration.Elem1:
                        Console.WriteLine("Elem1 caught!");
                        break;
                    case MyEnumeration.Elem2:
                        Console.WriteLine("Elem2 caught");
                        break;
                    case MyEnumeration.Elem3:
                        Console.WriteLine("Elem3 caught");
                        break;
                    default:
                        Console.WriteLine("Does not compute");
                        break;
                }
            }

            Console.ReadLine();

        }
    }

    enum MyEnumeration
    {
        Elem1,
        Elem2,
        Elem3
    }

}    
然后我尝试在一个新项目中使用这个类,如下所示

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace MyClasses
{

    public class MyEnum
    {
    // here goes all of Simons's code
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MyClasses;

namespace MyEnumerations
{
    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("Type in a name: ");
            string userValue = Console.ReadLine();

            MyEnumeration myValue;

            if (MyEnum.EnumTryParse(myValue,userValue, out myValue))
            {
                switch (myValue)
                {
                    case MyEnumeration.Elem1:
                        Console.WriteLine("Elem1 caught!");
                        break;
                    case MyEnumeration.Elem2:
                        Console.WriteLine("Elem2 caught");
                        break;
                    case MyEnumeration.Elem3:
                        Console.WriteLine("Elem3 caught");
                        break;
                    default:
                        Console.WriteLine("Does not compute");
                        break;
                }
            }

            Console.ReadLine();

        }
    }

    enum MyEnumeration
    {
        Elem1,
        Elem2,
        Elem3
    }

}    
但是我无法获得使用“EnumTryParse”方法的正确sintax:具体来说,我似乎无法正确传递第一个参数,该参数必须是“Type”

事实证明,我对C#完全是一个新手,我确信我一定错过了一些东西,一旦我拿到了合适的辛塔克斯,这些东西会让我头晕目眩。但现在我还是要坚持下去


感谢您提供的任何可能的帮助

错误消息说,您需要将枚举类型作为第一个参数传递。您还需要更改
myValue
的类型,以匹配
EnumTryParse
out
参数,以便:

object myValue;
if (MyEnum.EnumTryParse(typeof(MyEnumeration), userValue, out myValue))
{
    MyEnumeration actualValue = (MyEnumeration) myValue;
    ...
}

您可能还需要考虑我的项目,这将允许:

MyEnumeration myValue;
if (Enums.TryParseName(userValue, out myValue))
{
    // Do stuff
}
或使用显式类型参数:

MyEnumeration myValue;
if (Enums.TryParseName<MyEnumeration>(userValue, out myValue))
{
    // Do stuff
}
MyEnumeration myValue;
if(Enums.TryParseName(userValue,out myValue))
{
//做事
}

无约束Melody有一系列通用方法,包括扩展方法,这些方法允许在不使用通常涉及的装箱和施法的情况下完成所有这些操作。

枚举parse方法的最后一个参数是
out object
,因此您传递的参数必须是
object
类型,不
MyEnumeration
(因为
ref
out
参数是不变的)。由于这不是很方便,我建议您将该方法改为通用:

public static bool EnumTryParse<T>(string s, out T value)
{
    value = default(T);
    if (Enum.IsDefined(typeof(T), s))
    {
        value = (T)Enum.Parse(typeof(T), s);
        return true;
    }
    return false;
}

(泛型类型参数是从
myValue
的类型自动推断出来的,因此您不需要指定它)

但它给了我两个错误:1)与'ChojwaClasses.MyEnum.EnumTryParse(System.type,string,out object)最匹配的重载方法'有一些无效参数2)参数3:无法从'out MyEnumerations.MyEnumeration'转换为'out object'@user3598756:对,这表明
myValue
的类型不正确;它必须是
object
类型才能使用该方法。还有其他选择——你可能想看看我的无约束旋律项目:谢谢你,乔恩。我也从托马斯那里得到的。至于你的无约束旋律项目,我必须说我很惊讶。我刚刚开始学习C&VS,但他们都无法掌握大部分术语,也无法理解所有术语的体系结构。我已将该链接保存在“收藏夹”中,以后肯定会对其进行更深入、更深入的了解。@user3598756:使用该链接时,您不需要了解很多无约束Melody的背景-我在这里添加了一个示例。再次感谢Jon。我会比我想象的更早尝试一下!是的,它有效。非常感谢。现在我想改变Simon的方法来反映这个模式,即使用“out T value”作为最后一个参数。因为西蒙的方法似乎更通用。我试试看。如果你有什么建议,我会考虑的。谢谢again@user3598756是什么让你觉得Simon的答案更一般?我还发现了其他一些有用的东西(而且太长了!)。您还可以指定(如在Simon的代码中)是否区分大小写。@user3598756,仅仅因为他的代码较长,并不能使其成为通用代码;)。我看了他的代码,我不认为有任何情况下他的方法可以解析,而我的方法不能。这只是做同样事情的一个(长得多的)方法。我依赖于内置的.NET方法,而不是自己实现逻辑,但结果是一样的。您的方法无法管理区分大小写的选择。Simon和kiwipiet的代码理所当然地认为它不区分大小写。我正试图在您的代码的基础上,根据用户的选择管理案例敏感性。为此,在我看来,try/catch阻塞是不可避免的。但这似乎是一个程序员在读这篇博客时关注的话题。但我不知道为什么。