为了账号安全,请及时绑定邮箱和手机立即绑定

C# Performant 方法调用者属性用法

C# Performant 方法调用者属性用法

C#
白板的微信 2022-12-24 09:53:11
我正在为提供公共端点和经过身份验证的端点的 API 编写客户端库。我想轻松地指出哪些端点需要使用属性进行身份验证。例如:public async Task<ApiResponse> GetPublicData(){  var request = CreateRequest( "v1/public" );  return await _httpClient.GetAsync( request );}[RequiresAuthentication]public async Task<ApiResponse> GetPrivateData(){  var request = CreateRequest( "v1/private" );  return await _httpClient.GetAsync( request );}private ApiRequest CreateRequest( string endpoint ){   var request = new ApiRequest( endpoint );   // if (caller has RequiresAuthenticationAttribute)   //    SignRequest( request, _credentials );   return request;}据我所知,无论 的调用者是否CreateRequest具有 a ,我都可以访问的唯一方法RequiresAuthenticationAttribute是创建堆栈框架,通过反射找到方法,然后尝试从MethodInfo. 这可能非常慢。有没有其他方法可以将此信息传递给不会影响性能的被调用方。我知道请求总是会受到 API 响应时间的限制,但是考虑到它与财务数据有关,必须能够尽快触发请求,并且能够在短时间内完成涉及属性而不是手动传递参数的干净方式会非常好。
查看完整描述

2 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

您可以尝试使用CallerMemberNameAttribute class


属性“允许您获取方法调用者的方法或属性名称。”


private ApiRequest CreateRequest(string endpoint, [CallerMemberName] string callerMemberName= "")

{

    var methodInfo = this.GetType().GetMethod(callerMemberName);

    var attributes = (RequiresAuthenticationAttribute)method.GetCustomAttributes(typeof(RequiresAuthenticationAttribute), true);


    var request = new ApiRequest( endpoint );


    if (attributes.Any())

        SignRequest(request, _credentials);


    return request;

}



查看完整回答
反对 回复 2022-12-24
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

如果您开始使用属性,那么您将不得不以一种或另一种方式使用反射。一些反射机制比其他机制更快,但仍然存在运行时间损失,您必须为此付出代价。另一方面,如果您想要的是关注点分离(并且使用属性不是给定的),那么您可能需要考虑使用接口来分离这些关注点。


例如:


public interface IAuthenticated

{

  public async Task<ApiResponse> GetPrivateData();

}


public interface IPublicAccess

{

  public async Task<ApiResponse> GetPublicData();

}


public async Task<ApiResponse> IPublicAccess.GetPublicData()

{

  var request = CreateRequest( "v1/public" );

  return await _httpClient.GetAsync( request );

}


public async Task<ApiResponse> IAuthenticated.GetPrivateData()

{

  var request = CreateRequest( "v1/private" );

  return await _httpClient.GetAsync( request );

}


private ApiRequest CreateRequest( string endpoint )

{

   var request = new ApiRequest( endpoint );


   // if (caller has RequiresAuthenticationAttribute)

   //    SignRequest( request, _credentials );


   return request;

}


查看完整回答
反对 回复 2022-12-24
  • 2 回答
  • 0 关注
  • 95 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号