gpt4 book ai didi

C#检查属性的扩展方法

转载 作者:可可西里 更新时间:2023-11-01 08:06:02 24 4
gpt4 key购买 nike

抱歉,如果这是一个愚蠢的菜鸟问题,请对我温柔一点,我正在努力学习...

我想针对模型和 Controller 等事物的属性方法进行测试。主要是为了确保它们具有正确的属性,即 Required。但我也将其用作扩展方法和 Lambdas 的实验。

我想要的是一种方法,当 implimented 看起来像

Controller controller = new Controller();
controller.MethodName(params).HasAttribute<AttributeName>();

我使用了一点扩展方法,但没用到这个程度。我相信这应该很简单,但似乎无法让我的泛型等正确。

最佳答案

也许您正在寻找这个:

Controller controller = new Controller();
bool ok = controller.GetMethod(c => c.MethodName(null, null))
.HasAttribute<AttributeName>();

这样写的好处是你有完全的编译时支持。到目前为止,所有其他解决方案都使用字符串文字来定义方法。

以下是 GetMethod 的实现和 HasAttribute<T>扩展方法:

public static MethodInfo GetMethod<T>(this T instance,
Expression<Func<T, object>> methodSelector)
{
// Note: this is a bit simplistic implementation. It will
// not work for all expressions.
return ((MethodCallExpression)methodSelector.Body).Method;
}

public static MethodInfo GetMethod<T>(this T instance,
Expression<Action<T>> methodSelector)
{
return ((MethodCallExpression)methodSelector.Body).Method;
}

public static bool HasAttribute<TAttribute>(
this MemberInfo member)
where TAttribute : Attribute
{
return GetAttributes<TAttribute>(member).Length > 0;
}

public static TAttribute[] GetAttributes<TAttribute>(
this MemberInfo member)
where TAttribute : Attribute
{
var attributes =
member.GetCustomAttributes(typeof(TAttribute), true);

return (TAttribute[])attributes;
}

关于C#检查属性的扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3476757/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com