网关参数 添加参数和参数转换为对象功能

This commit is contained in:
varorbc
2017-10-28 18:00:00 +08:00
parent b2e6df6ace
commit f652cf4743
5 changed files with 168 additions and 37 deletions
@@ -0,0 +1,16 @@
using System;
namespace ICanPay.Core
{
/// <summary>
/// 重命名属性
/// </summary>
public class ReNameAttribute : Attribute
{
public string Name { get; set; }
public ReNameAttribute()
{
}
}
}
-36
View File
@@ -178,42 +178,6 @@ namespace ICanPay.Core
}
}
/// <summary>
/// 读取通知
/// </summary>
protected void ReadNotify<T>() where T : INotify
{
var type = typeof(T);
var notify = Activator.CreateInstance(type);
var properties = type.GetProperties();
foreach (var item in properties)
{
string key = item
.GetCustomAttributesData()[0]
.NamedArguments[0]
.TypedValue
.Value
.ToString();
object value = GatewayData.GetValue(key);
if (value != null)
{
item.SetValue(notify, Convert.ChangeType(value, item.PropertyType));
}
}
Notify = (INotify)notify;
}
/// <summary>
/// 异步读取通知
/// </summary>
protected async Task ReadNotifyAsync<T>() where T : INotify
{
await Task.Run(() => ReadNotify<T>());
}
protected void OnPaymentFailed(PaymentFailedEventArgs e) => PaymentFailed?.Invoke(this, e);
protected void OnPaymentSucceed(PaymentSucceedEventArgs e) => PaymentSucceed?.Invoke(this, e);
+65
View File
@@ -54,6 +54,38 @@ namespace ICanPay.Core
return true;
}
/// <summary>
/// 添加参数
/// </summary>
/// <returns></returns>
public bool Add(object obj)
{
var type = obj.GetType();
var properties = type.GetProperties();
foreach (var item in properties)
{
var key = item.Name.ToSnakeCase();
var value = item.GetValue(obj);
if (value is null || string.IsNullOrEmpty(value.ToString()))
{
continue;
}
if (Exists(key))
{
Values[key] = value;
}
else
{
Values.Add(key, value);
}
}
return true;
}
/// <summary>
/// 根据参数名获取参数值
/// </summary>
@@ -362,6 +394,39 @@ namespace ICanPay.Core
}
}
/// <summary>
/// 将网关参数转为类型
/// </summary>
public T ToObject<T>()
{
var type = typeof(T);
var obj = Activator.CreateInstance(type);
var properties = type.GetProperties();
foreach (var item in properties)
{
string key;
var renameAttribute = item.GetCustomAttributes(typeof(ReNameAttribute), true);
if (renameAttribute.Count() > 0)
{
key = ((ReNameAttribute)renameAttribute[0]).Name;
}
else
{
key = item.Name.ToSnakeCase();
}
object value = GetValue(key);
if (value != null)
{
item.SetValue(obj, Convert.ChangeType(value, item.PropertyType));
}
}
return (T)obj;
}
/// <summary>
/// 清空网关数据
/// </summary>
+5 -1
View File
@@ -113,7 +113,11 @@ namespace ICanPay.Core
}
else
{
gatewayData.FromForm(HttpUtil.Form);
try
{
gatewayData.FromForm(HttpUtil.Form);
}
catch { }
}
}
+82
View File
@@ -1,5 +1,6 @@
using Newtonsoft.Json;
using System;
using System.Text;
namespace ICanPay.Core
{
@@ -42,6 +43,87 @@ namespace ICanPay.Core
return (int)(time.ToUniversalTime().Ticks / 10000000 - 62135596800);
}
#region 字符串策略
internal enum SnakeCaseState
{
Start,
Lower,
Upper,
NewWord
}
/// <summary>
/// 将字符串转换为蛇形策略
/// </summary>
/// <param name="s">字符串</param>
/// <returns></returns>
public static string ToSnakeCase(this string s)
{
if (string.IsNullOrEmpty(s))
{
return s;
}
StringBuilder sb = new StringBuilder();
SnakeCaseState state = SnakeCaseState.Start;
for (int i = 0; i < s.Length; i++)
{
if (s[i] == ' ')
{
if (state != SnakeCaseState.Start)
{
state = SnakeCaseState.NewWord;
}
}
else if (char.IsUpper(s[i]))
{
switch (state)
{
case SnakeCaseState.Upper:
bool hasNext = (i + 1 < s.Length);
if (i > 0 && hasNext)
{
char nextChar = s[i + 1];
if (!char.IsUpper(nextChar) && nextChar != '_')
{
sb.Append('_');
}
}
break;
case SnakeCaseState.Lower:
case SnakeCaseState.NewWord:
sb.Append('_');
break;
}
sb.Append(char.ToLowerInvariant(s[i]));
state = SnakeCaseState.Upper;
}
else if (s[i] == '_')
{
sb.Append('_');
state = SnakeCaseState.Start;
}
else
{
if (state == SnakeCaseState.NewWord)
{
sb.Append('_');
}
sb.Append(s[i]);
state = SnakeCaseState.Lower;
}
}
return sb.ToString();
}
#endregion
#endregion
}
}