向另一个程序集's类添加属性

本文关键字:添加 属性 另一个 程序集 | 更新日期: 2023-09-27 18:16:02

是否有可能扩展在另一个程序集中定义的类型,以在其其中一个属性上添加属性?

示例我有在汇编FooBar:

public class Foo
{
   public string Bar { get; set; }
}

但是在我的UI程序集中,我想将此类型传递给第三方工具,并且为了使该第三方工具正常工作,我需要Bar属性具有特定属性。这个属性是在第三方程序集中定义的,我不想在我的FooBar程序集中引用这个程序集,因为FooBar包含我的域,这是一个UI工具。

向另一个程序集's类添加属性

如果第三方工具使用标准反射来获取您的类型的属性,则不能

如果第三方工具使用TypeDescriptor API获取您的类型的属性,您可以

类型描述符case的示例代码:

public class Foo
{
    public string Bar { get; set; }
}
class FooMetadata
{
    [Display(Name = "Bar")]
    public string Bar { get; set; }
}
static void Main(string[] args)
{
    PropertyDescriptorCollection properties;
    AssociatedMetadataTypeTypeDescriptionProvider typeDescriptionProvider;
    properties = TypeDescriptor.GetProperties(typeof(Foo));
    Console.WriteLine(properties[0].Attributes.Count); // Prints X
    typeDescriptionProvider = new AssociatedMetadataTypeTypeDescriptionProvider(
        typeof(Foo),
        typeof(FooMetadata));
    TypeDescriptor.AddProviderTransparent(typeDescriptionProvider, typeof(Foo));
    properties = TypeDescriptor.GetProperties(typeof(Foo));
    Console.WriteLine(properties[0].Attributes.Count); // Prints X+1
}

如果你运行这段代码,你会看到最后的控制台写入打印加上一个属性,因为Display属性现在也被考虑。

No。不能从单独的程序集向类型添加属性。

但是,您可以做的是创建自己的类型来包装第三方类型。由于您可以完全控制包装器类,因此可以在那里添加属性。

怎么样:

public class Foo
{
    public virtual string Bar
}
public class MyFoo : Foo
{
     [yourcustomattribute]
     public overrides string Bar
}

我认为您需要的是某种适配器层,它不会让基础设施依赖泄漏到您的域逻辑中。也许您可以创建一个适配器类,它将像数据传输对象一样传输到其他技术。该类位于依赖于第三方库的集成程序集中:

public class FooDTO {
   [TheirAttribute]
   public string Bar { get; set; }
}

你可以使用像AutoMapper这样的东西来减轻改变表示的痛苦。

然而,理想的解决方案是,如果第三方库支持额外的方式来提供有关其操作的元数据。也许你可以问他们这个功能。