如何为具有特定属性的对象创建Linq扩展?

时间:2013-11-12 22:02:40

标签: c# .net linq extension-methods

我有兴趣为具有属性的对象(在本例中为[ProtoContract])进行扩展。

例如,扩展程序适用于:

[ProtoContract]
class myClass{
     //stuff
}

......但不是......

class someRandomClass
{
}

这里的区别在于,通常你可以制作这样的扩展函数:

public static byte[] Serialize<T>(this T instance){

...但在这种情况下,我希望它只适用于具有[ProtoContract]属性的类。

这可能吗?

2 个答案:

答案 0 :(得分:4)

可以使用Serialize方法内部的反射进行运行时检查,但不能进行检查编译时间,因为属性不属于类型的签名。

如果你想要进行编译时检查,你必须使用一个(稍微丑陋)的接口而没有方法而不是属性。

答案 1 :(得分:2)

您无法使用where对其进行过滤,您只需要抛出异常即可。考虑一下:

public static byte[] Serialize<T>(this T instance)
{
    if (!Attribute.IsDefined(typeof(T), typeof(ProtoContractAttribute)))
    {
        throw new Exception(...);
    }
}