Понятие "копирование" атрибутов отсутствует. Тем не менее, вы можете сделать что-то значимое в коде, который проверяет, применяется ли атрибут. Вы можете использовать другой атрибут, который сообщает коду, что он должен использовать другой тип для проверки атрибута [Required]. Например:
[AttributeUsage(AttributeTargets.Class)]
public class AttributeProviderAttribute : Attribute {
public AttributeProviderAttribute(Type t) { Type = t; }
public Type Type { get; set; }
}
Что бы вы использовали, как это:
public class Foo {
[Required]
public string Name { get; set; }
}
[AttributeProvider(typeof(Foo))]
public class Bar {
public string Name { get; set; }
}
Код, который проверяет атрибут, может выглядеть так:
static bool IsRequiredProperty(Type t, string name) {
PropertyInfo pi = t.GetProperty(name);
if (pi == null) throw new ArgumentException();
// First check if present on property as-is
if (pi.GetCustomAttributes(typeof(RequiredAttribute), false).Length > 0) return true;
// Then check if it is "inherited" from another type
var prov = t.GetCustomAttributes(typeof(AttributeProviderAttribute), false);
if (prov.Length > 0) {
t = (prov[0] as AttributeProviderAttribute).Type;
return IsRequiredProperty(t, name);
}
return false;
}
Обратите внимание, как этот код позволяет связывать поставщика атрибутов.