と反射を利用して、これは私のアプローチです:
まず、あなたの(簡単な)Attribute
あなたの「IDフィールド」飾るために:
[AttributeUsage(AttributeTargets.Property)]
public class IdFieldAttribute : Attribute
{
public IdFieldAttribute()
{
}
}
を次に、あなたのクラスは、次のようになります。
を
public class Item
{
[IdFieldAttribute]
public Guid YourIdField{ get; set; }
// ...
}
ご希望のフィールドを取得するためのReflection
ヘルパークラス:
public static class ReflectionHelper
{
public static PropertyInfo GetPropertyInfoByAttribute<T>(T o, Type attributeType) where T : class
{
var type = o.GetType();
var propertyInfo = type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.FirstOrDefault(pi => Attribute.IsDefined(pi, attributeType));
return propertyInfo;
}
}
あなたがこれをしたら、あなたのAuthorize
方法は次のようになります。
public static IQueryable<T> Authorize<T>(this IQueryable<T> items) where T : class
{
return items.Where(i => (Guid)ReflectionHelper.GetPropertyInfoByAttribute(i, typeof(IdFieldAttribute)).GetValue(i) == new Guid("4A6FE5AF-AB63-4BB3-9D32-88766CF242CC"));
}
そして、次のようにあなたはそれを使用することができます。
var result = items.AsQueryable().Authorize();
をお探しのものがあれば、私にはわかりませんこのようなものです。多分このアプローチがあなたを助けるかもしれません。
ありがとうございます。実際には既にこの実装を過負荷として使用しています。しかし、私はインターフェイスで指定された以外のフィールドを使用できるようにしたい。 – user1039407
反射があなたに役立つかもしれません。あなたのidフィールドを1つの 'Attribute'で「飾り」し、' Authorize'メソッドでリフレクションを使用して –