我有兴趣为具有属性的对象(在本例中为[ProtoContract]
)进行扩展。
例如,扩展程序适用于:
[ProtoContract]
class myClass{
//stuff
}
......但不是......
class someRandomClass
{
}
这里的区别在于,通常你可以制作这样的扩展函数:
public static byte[] Serialize<T>(this T instance){
...但在这种情况下,我希望它只适用于具有[ProtoContract]
属性的类。
这可能吗?
答案 0 :(得分:4)
可以使用Serialize
方法内部的反射进行运行时检查,但不能进行检查编译时间,因为属性不属于类型的签名。
如果你想要进行编译时检查,你必须使用一个(稍微丑陋)的接口而没有方法而不是属性。
答案 1 :(得分:2)
您无法使用where
对其进行过滤,您只需要抛出异常即可。考虑一下:
public static byte[] Serialize<T>(this T instance)
{
if (!Attribute.IsDefined(typeof(T), typeof(ProtoContractAttribute)))
{
throw new Exception(...);
}
}