这是可能做到这一点:
public static void SomeMethod<TFunc>(Expression<TFunc> expr)
{
//LambdaExpression happily excepts any Expession<TFunc>
LambdaExpression lamb = expr;
}
Run Code Online (Sandbox Code Playgroud)
并在其他地方调用它传递参数的lambda:
SomeMethod<Func<IQueryable<Person>,Person>>( p=>p.FirstOrDefault());
Run Code Online (Sandbox Code Playgroud)
我想改为将表达式作为参数传递给属性构造函数. 可以这样做吗?
class ExpandableQueryAttribute: Attribute {
private LambdaExpression someLambda;
//ctor
public ExpandableQueryMethodAttribute(LambdaExpression expression)
{
someLambda = expression
}
}
//usage:
static LambdaExpression exp =
(Expression<Func<IQueryable<Person>, Person>>)
(p => p.FirstOrDefault());
[ExpandableQueryAttribute(exp)] //error here
// "An attribute argument must be a constant expression, typeof expression
// or array creation expression of an attribute parameter type"
Run Code Online (Sandbox Code Playgroud)
我的目标是在属性的构造函数中指定方法或lambda(即使我必须声明一个完整的命名方法并以某种方式传递方法的名称,这样就可以了).
参数类型可以更改,但重要的是属性构造函数可以获取该参数,并以某种方式将其分配给LambdaExpression类型的字段
我希望lambda …
这是我的方法
public Component SaveComponent([ValidateMetaFields] Component componentToSave) {
...
}
Run Code Online (Sandbox Code Playgroud)
这是我的自定义属性:
[AttributeUsage(AttributeTargets.Parameter)]
public class ValidateMetaFieldsAttribute : Attribute
{
public ValidateMetaFieldsAttribute()
{
// how to access `componentToSave` here?
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道有没有办法从中访问componentToSave对象ValidateMetaFieldsAttribute?我找不到任何示例代码或示例.
在C#中是否有一种方法可以将方法标记为类的一部分以满足该类实现的接口?我发现自己有时想在挖掘类的代码时为什么会有一些方法,但是当我尝试删除一个因为它没有被使用时,我认为为了让类实现一些接口是必要的.将这些方法标记为这样是很好的.也许就像Java中的@Override注释一样.
编辑: 我宁愿不显式实现接口,因为然后访问我的类的实例上的接口方法变得更麻烦(即,MyClass必须IMyInterface在调用之前转换一个实例MyInterfaceMethod).
编辑: 我也不想使用区域.我不希望通过一些任意名称松散地描述一大块代码作为接口实现的一部分,而是表示特定方法,无论它们在类中的哪个位置,都是接口的一部分.甚至一些XML评论模板用于说明该方法所属的接口会很好.
编辑: 所有答案似乎建议我明确实现接口,我不想做,或我使用区域,我也不想这样做.我认为威尔最了解我的要求.我希望有类似注释的东西,所以我可以做类似以下的事情:
[Interface(IMyInterface)]
public void MyImplicitlyImplementedInterfaceMethod() { }
Run Code Online (Sandbox Code Playgroud)
或者,正如dss539在对此答案的评论中提到的那样:
public implement void MyImplicitlyImplementedInterfaceMethod() { }
Run Code Online (Sandbox Code Playgroud)
就像我们override今天一样: public override bool Equals(object obj) { }.