Как использовать enum с атрибутами Reflections? - PullRequest
0 голосов
/ 12 июля 2011

Я открыт вашим идеям: мне очень не нравится это использование. как преобразовать перечисление в строку с помощью атрибутов. Но, пожалуйста, будьте осторожны, мой вопрос StringValueAttribute имеет более одного конструктора и поля. Как разработать метод расширения GetStringValue через StringValueAttribute ??? С наилучшими пожеланиями ...



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

namespace UsingAttributes
{
        static void Main(string[] args)
        {
            Console.WriteLine(UserType.Login.GetStringValue());
            Console.Read();
        }
    }
    public enum UserType : int
    {
        [StringValueAttribute("xyz", "test")]
        Login = 1
    }
    public class StringValueAttribute : Attribute
    {
        public string UserName { get; protected set; }
        public string PassWord { get; protected set; }
        public decimal Something { get; protected set; }

          public StringValueAttribute(string Username, string Password,decimal something)
        {
            UserName = Username;
            PassWord = Password;
            Something  =something;
        }
        public StringValueAttribute(string Username, string Password)
        {
            UserName = Username;
            PassWord = Password;
        }
       public StringValueAttribute(string Username)
        {
            UserName = Username;

        }

    }

    public static class Extentions
    {
        public static String[] GetStringValue(this Enum value)
        {
            // Get the type
            Type type = value.GetType();

            // Get fieldinfo for this type
            FieldInfo fieldInfo = type.GetField(value.ToString());

            // Get the stringvalue attributes
            StringValueAttribute[] attribs = fieldInfo.GetCustomAttributes(
                typeof(StringValueAttribute), false) as StringValueAttribute[];

            // Return the first if there was a match.


                PropertyInfo[] pi = attribs[0].GetType().GetProperties();
                String[] Vals = new String[pi.Length];
                int i = 0;
                foreach (PropertyInfo item in pi)
                {
                   // Vals[i] =  How to return String[] 

                }
            // i dislike return values one by one : attribs[0].UserName 
           //return attribs.Length > 0 ? attribs[0].UserName : null; // i have more values
        }
    }
}

Ответы [ 2 ]

1 голос
/ 12 июля 2011

Я должен сказать, что это странный способ сделать это, но вам просто нужно изменить код на что-то вроде этого:

static void Main(string[] args)
        {
            object[] Objects = UserType.Login.GetStringValue();
            for (int x = 0; x < Objects.Length; ++x)
                Console.WriteLine(Objects[x].ToString());
            Console.Read();
        }
    }

    public static class Extentions
    {
        public static object[] GetStringValue(this Enum value)
        {
            // Get the type
            Type type = value.GetType();

            // Get fieldinfo for this type
            FieldInfo fieldInfo = type.GetField(value.ToString());

            // Get the stringvalue attributes
            StringValueAttribute[] attribs = fieldInfo.GetCustomAttributes(
                typeof(StringValueAttribute), false) as StringValueAttribute[];

            // Return the first if there was a match.

            object[] Vals = new object[3];
            Vals[0] = attribs[0].UserName;
            Vals[1] = attribs[0].PassWord;
            Vals[2] = attribs[0].Something;
            return Vals;
        }
    }
0 голосов
/ 12 июля 2011

Во-первых, обратите внимание, что decimal нельзя использовать в качестве аргумента атрибута.Вы можете использовать double или строку, а затем преобразовать ее в десятичную.

Ваш GetStringValue () должен работать, если вы замените

    // Vals[i] =  How to return String[]

на

    Object val = item.GetValue(attribs[0], null);
    Vals[i++] = val != null ? val.ToString() : "";

Если вы используете C # 4.0, вам не нужны три конструктора.Вы можете использовать необязательные аргументы:

public StringValueAttribute(string Username, string Password = "nothing", double something = 0)         
{             
     ...
}         

А в более старых версиях C # вы можете использовать OptionalAttribute:

public StringValueAttribute(string Username, [Optional] string Password, [Optional] double something)         
{             
     ...
}         
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...