我有几个类具有以下数据合同定义和元数据类
[MetadataType(typeof(ClassAMetadata))]
public partial class ClassA
{
public string PropertyA { get; set; }
}
public class ClassAMetadata
{
[CustomAttribute(Title = "PropertyAText")]
public string PropertyA { get; set; }
}
然后,我想使用以下代码从当前程序集中获取在所有程序集类型中使用的 CustomAttribute 的属性 Title:
internal static Dictionary<string, string> GetCustomAttributeTitles<T>(this T entity) where T : class
{
Dictionary<string, string> result = (from prop in TypeDescriptor.GetProperties(entity.GetType()).Cast<PropertyDescriptor>()
from att in prop.Attributes.OfType<CustomAttribute>()
select new { prop.Name, att.Title }).ToDictionary(t => t.Name, t => t.Title);
return result;
}
在调用 GetCustomAttributeTitles 方法之前,我在类型描述符中加载元数据属性:
public static void InstallForAssembly(Assembly assembly)
{
if (assembly == null)
{
throw new ArgumentNullException("assembly");
}
foreach (Type type in assembly.GetTypes())
{
foreach (MetadataTypeAttribute attrib in type.GetCustomAttributes(typeof(MetadataTypeAttribute), true))
{
TypeDescriptor.AddProviderTransparent(
new AssociatedMetadataTypeTypeDescriptionProvider(type, attrib.MetadataClassType), type);
}
}
}
我的程序的一个例子是:
InstallForAssembly(Assembly.LoadFile(Environment.CurrentDirectory + "\\DataContract.dll"));
ClassA instanceOfA = new ClassA();
//fill instanceOfA
var dictionary = instanceOfA.GetCustomAttributeTitles();
//do something with dictionary
这在控制台应用程序中运行良好,但在 WCF 服务方法中不起作用,GetCustomAttributeTitles 方法中的字典始终为空。为什么会发生?