这是我第一次编写简单的自定义属性。让我先说明我做了什么
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;那怎么能实现呢?
答案 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()));
}
}