如何从使用自定义属性(也是枚举)的类中传递枚举值?

时间:2015-04-04 11:42:38

标签: c#

这是我第一次编写简单的自定义属性。让我先说明我做了什么

providers.cs

public enum Providers
    {
        Employee,
        Product
    };

MyCustomAttribute.cs

[AttributeUsage(AttributeTargets.Class) ]
    public class ServiceProvider : System.Attribute
    {
        private Providers provider;        

        public ServiceProvider(Providers provider)
        {
            this.provider = provider;            
        }

        public Providers CustomProvider
        {
            get
            {
                return provider;
            }
        }
    }

A.cs

[ServiceProvider(Providers.Employee)]
    public class A
    { 
        public void SomeMethod()
        {
            Console.WriteLine(Dataclass.GetRecord("Employee"));
        }
    }

B.cs

[ServiceProvider(Providers.Product)]
    public class B
    {
        public void SomeMethod()
        {
            Console.WriteLine(Dataclass.GetRecord("Product"));
        }
    }

dataclass.cs

public static class Dataclass
    {
        public static string GetRecord(string key)
        {
            return InfoDictionary()[key];
        }

        private static Dictionary<string, string> InfoDictionary()
        {
            Dictionary<string, string> dictionary = new Dictionary<string, string>();
            dictionary.Add("Employee", "This is from Employees");
            dictionary.Add("Product", "This is from proucts");
            return dictionary;
        }
    }

目前,我正在努力编码&#34;键&#34;来自个别课程即。 A和B.

我正在寻找的是,如果我使用[ServiceProvider(Providers.Employee)]装饰我的A类,那么 GetRecord 方法应该为我提供员工相关价值。

对于B类,如果我使用 [ServiceProvider(Providers.Product)] 进行装饰,我应该能够获得与产品相关的价值。

NB~ 我知道通过传递Enum并转换为字符串来实现它是一件简单的事情,但正如我所说我正在学习自定义属性,所以我想这样做只是这样。

如果可能,请告诉我,是否&#34;是&#34;那怎么能实现呢?

1 个答案:

答案 0 :(得分:1)

您可以通过反射访问自定义属性

var type = typeof(A);
var attributes = type.GetCustomAttributes(typeof(ServiceProvider),inherit:false);

这将为您提供A类所有服务提供者属性的数组。

您的示例并未真正展示您希望如何应用它,但是为了适应您拥有的扩展方法

public static class ClassExtenstions
{
    public static Providers? GetServiceProvider<T>(this T cls) where T : class
    {
        var attribute = typeof(T).GetCustomAttributes(typeof (ServiceProvider), inherit: false).FirstOrDefault() as ServiceProvider;
        return attribute != null ? attribute.CustomProvider : (Providers?)null;
    }
}

在课堂上你会用它作为

[ServiceProvider(Providers.Employee)]
public class A
{ 
    public void SomeMethod()
    {
        var provider = this.GetServiceProvider();
        Console.WriteLine(Dataclass.GetRecord(provider.ToString()));
    }
}