Есть ли способ обойти это?
Да.
Ваш атрибут может использовать свойство Type
, а затем использовать типы, которые реализуют определенный интерфейс , для которого код, обрабатывающий этот атрибут, должен будет принять и, таким образом, также создать неявный , но, надеюсь, документированный ,требование к своим клиентам:
public interface IValueRange {
int Start { get; }
int End { get; }
}
public class MyAttr : Attribute {
// The used type must implement IValueRange
public Type ValueRangeType { get; set; }
}
// ....
public class Foo {
class FooValueRange : IValueRange {
public int Start { get { return 10; } }
public int End { get { return 20; } }
}
[MyAttr(ValueRangeType = typeof(FooValueRange))]
public string Prop { get; set; }
}
Это мало чем отличается от многих классов в пространстве имен System.ComponentModel
, например DesignerAttribute
.