qinking126
그는 물었다 8 лет назад
83

이넘 목록 () 은 문자열 값이 있는지 확인하는 방법?

나는 내 나이는 쿼리 문자열 변수를 기간보다오래된 = New_Born '?'.

내가 할 수 있는 방법이 있는지 이 문자열 값은 New_Born '는' 내 이넘 목록

[Flags]
public enum Age
{
    New_Born = 1,
    Toddler = 2,
    Preschool = 4,
    Kindergarten = 8
}

난 지금 내 경우 이보다 더 좋을 순 없지만, 만약 이넘 목록에 대한 더 큰 기술서임을 사용할 수 있습니다. 더 나은 방법을 찾기 i want to do it. 생각 나는 건 아니지만, Linq 사용하려면 어떻게 해야 합니다.

agent-j
그는 8 лет назад 댓글을 달았습니다
0

일부 동의하십시오 답을 할 수 있습니다.

답변 7 개

사용할 수 있습니다.

 Enum.IsDefined(typeof(Age), youragevariable)

Viacheslav Smityukh
그는 8 лет назад 댓글을 달았습니다
0

이넘 인스턴스입니다 이데핀드 单捞磐啊 확인할 수 있습니다.

Viacheslav Smityukh
그는 8 лет назад 댓글을 달았습니다
0

39 m 실패했습니다. 이데핀드 인컨텍스트 동의하십시오 이넘 및 이름, I&.

Cheshire Cat
그는 6 лет назад 댓글을 달았습니다
8

즉, '에누마리아드핀드 ()' 는 대소문자 구분! 그래서 that& # 39 의 아닌 범용 solution&quot ";).

Weihui Guo
그는 3 года назад 댓글을 달았습니다
6

39 는 일반적으로 사용하지 않는 것을 사용하고 있기 때문에, s it& 이데핀드 반사 userdic. 이데핀드 성능 면에서 매우 값비싼 전화로 통화 및 CPU. 대신 트레이퍼스 사용합니다. (learned from pluralsight.com)

에누마리트리파스 방법을 사용할 수 있습니다.

Age age;
if (Enum.TryParse<Age>("New_Born", out age))
{
    // You now have the value in age 
}

Romain Vincent
그는 3 года назад 댓글을 달았습니다
2

문제는 이런 것이 진정한 반환되므로 제공할 경우 모든 정수 (대신 New_Born&quot 너회의 "; 문자열, 내 말은).

트레이퍼스 방법을 사용할 수 있습니다 진정한 반환하는 경우 성공:

Age age;

if(Enum.TryParse<Age>("myString", out age))
{
   //Here you can use age
}

39, ve got a 제품을 사용하는 방법 등 i& 확장명은 트레이퍼스 이데핀드 대 / 소문자를 구분합니다.

public static bool IsParsable<T>(this string value) where T : struct
{
    return Enum.TryParse<T>(value, true, out _);
}

하지만 이것은 오래된 그러니까말이야 스레드할 here& # 39 의 약간 다른 속성을 사용하여 열거합니다 helper class 에서 찾을 수 있는 열거하십시오 외곽진입 다음 경기에 출전하였다.

이렇게 여러 매핑이라는 외상때문에 단일 열거하십시오.

public enum Age
{
    [Metadata("Value", "New_Born")]
    [Metadata("Value", "NewBorn")]
    New_Born = 1,
    [Metadata("Value", "Toddler")]
    Toddler = 2,
    [Metadata("Value", "Preschool")]
    Preschool = 4,
    [Metadata("Value", "Kindergarten")]
    Kindergarten = 8
}

이렇게 내 손으로 helper class

public static class MetadataHelper
{
    public static string GetFirstValueFromMetaDataAttribute<T>(this T value, string metaDataDescription)
    {
        return GetValueFromMetaDataAttribute(value, metaDataDescription).FirstOrDefault();
    }

    private static IEnumerable<string> GetValueFromMetaDataAttribute<T>(T value, string metaDataDescription)
    {
        var attribs =
            value.GetType().GetField(value.ToString()).GetCustomAttributes(typeof (MetadataAttribute), true);
        return attribs.Any()
            ? (from p in (MetadataAttribute[]) attribs
                where p.Description.ToLower() == metaDataDescription.ToLower()
                select p.MetaData).ToList()
            : new List<string>();
    }

    public static List<T> GetEnumeratesByMetaData<T>(string metadataDescription, string value)
    {
        return
            typeof (T).GetEnumValues().Cast<T>().Where(
                enumerate =>
                    GetValueFromMetaDataAttribute(enumerate, metadataDescription).Any(
                        p => p.ToLower() == value.ToLower())).ToList();
    }

    public static List<T> GetNotEnumeratesByMetaData<T>(string metadataDescription, string value)
    {
        return
            typeof (T).GetEnumValues().Cast<T>().Where(
                enumerate =>
                    GetValueFromMetaDataAttribute(enumerate, metadataDescription).All(
                        p => p.ToLower() != value.ToLower())).ToList();
    }

}

그런 다음 같은 일을

var enumerates = MetadataHelper.GetEnumeratesByMetaData<Age>("Value", "New_Born");

다음은 및 완전성을 위해 속성:

 [AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = true)]
public class MetadataAttribute : Attribute
{
    public MetadataAttribute(string description, string metaData = "")
    {
        Description = description;
        MetaData = metaData;
    }

    public string Description { get; set; }
    public string MetaData { get; set; }
}

목표에 대한 콩지름에 에누마리트리파스 아키베

이는 예:

[Flags]
private enum TestEnum
{
    Value1 = 1,
    Value2 = 2
}

static void Main(string[] args)
{
    var enumName = "Value1";
    TestEnum enumValue;

    if (!TestEnum.TryParse(enumName, out enumValue))
    {
        throw new Exception("Wrong enum value");
    }

    // enumValue contains parsed value
}

구문 분석을 위해 나이:

Age age;
if (Enum.TryParse(typeof(Age), "New_Born", out age))
  MessageBox.Show("Defined");  // Defined for "New_Born, 1, 4 , 8, 12"

To see if 정의된다.

if (Enum.IsDefined(typeof(Age), "New_Born"))
   MessageBox.Show("Defined");

, 플래그를 사용하여 이넘 계획에 따라 '시대' 올바른 일을 할 수 없습니다. [플래그] ',' 허용할 것을 이미 알고 계신 것처럼 여러 값 (같이 비트 마스크를). "에 대한 여러 값을 갖고 있기 때문에 '거짓' 이데핀드 반환되므로 지오토드러 지그프레쇼올 '.

agent-j
Servy
그는 8 лет назад 댓글을 달았습니다
2

[트레이퍼스] (http://msdn.microsoft.com/en-us/library/dd783499.aspx) 이후 # 39 의 검증되지 않은 입력입니다 it& 사용해야 합니다.

Servy
그는 8 лет назад 댓글을 달았습니다
1

39, 웹 환경을 메사그버스 doesn& 정말 쉽게 이해할 수 없다.