Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C Performant方法调用方属性用法_C#_Reflection_Attributes - Fatal编程技术网

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

C# C Performant方法调用方属性用法,c#,reflection,attributes,C#,Reflection,Attributes,我正在为一个API编写一个客户端库,该API同时提供公共端点和经过身份验证的端点。我想简单地指出哪些端点需要使用属性进行身份验证。例如: public async Task<ApiResponse> GetPublicData() { var request = CreateRequest( "v1/public" ); return await _httpClient.GetAsync( request ); } [RequiresAuthentication] publ

我正在为一个API编写一个客户端库,该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调用方是否具有RequireAuthenticationAttribute的唯一方法是创建堆栈帧,通过反射找到方法,然后尝试从MethodInfo获取属性。这可能非常慢

是否有其他方法可以将此信息传递给被调用方,而不会影响性能。我知道请求将始终受到API响应时间的限制,但考虑到它与财务数据有关,必须尽快发出请求,能够以一种涉及属性而不是手动传递参数的干净方式来完成这项工作将非常好。

您可以尝试使用CallerMemberNameAttribute

属性允许您获取方法调用方的方法或属性名


如果设置为使用属性,则必须以某种方式使用反射。一些反射机制比其他反射机制更快,但仍然需要支付运行时罚款。另一方面,如果您希望分离关注点,并且使用属性不是给定的,那么您可能需要考虑使用接口来分离这些关注点

例如:

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;
}
你可以试试
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;
}