1

我有几个类具有以下数据合同定义和元数据类

[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 方法中的字典始终为空。为什么会发生?

4

0 回答 0