gpt4 book ai didi

c# - 将类的多个属性传递给函数并返回自定义属性的值

转载 作者:行者123 更新时间:2023-12-04 15:23:25 25 4
gpt4 key购买 nike

我正在处理一个需要在两个系统之间进行映射的需求。因为这种映射相当广泛,所以我使用具有一些自定义属性的域模型来为数据检索和 crud 操作进行映射。

所以我的领域类看起来像这样:

[OhtherSystemObjectName("otherSystemAccountName")]
public class Account : SomeBaseClass
{
[OhtherSystemAttributeName("otherSystsemAccountNameColumn")]
public string Name { get; set; }

[OhtherSystemAttributeName("otherSystsemAccountNumberColumn")]
public string AccountNumber { get; set; }

[OhtherSystemAttributeName("otherSystsemAddressColumn")]
public string Address { get; set; }

[OhtherSystemAttributeName("otherSystsemPostalCodeColumn")]
public string PostalCode { get; set; }

}

我使用自定义属性来指定其他系统的列名,因此当需要检索或修改数据时,我不需要为这些操心。现在我想创建一种数据检索方法,我可以在其中使用表达式指定一个或多个列。该方法看起来像这样:

public string[] GetColumnSet<T>(Expression<Func<T, object[]>> attributes) where T : SomeBaseClass
{

return ((NewArrayExpression)attributes.Body).Expressions.Select(a =>
{

switch (a.NodeType)
{
case ExpressionType.MemberAccess:
return GetAttributeName((MemberExpression)a);
case ExpressionType.Convert:
return GetAttributeName((MemberExpression)((UnaryExpression)a).Operand);

}

return null;

}).Where(a => !string.IsNullOrEmpty(a)).ToArray();
}

private static string GetAttributeName(MemberExpression memberExpression)
{
var attribute = memberExpression.Member.GetCustomAttribute<OhtherSystemAttributeName>();
return attribute?.AttributeName;
}

我在映射层中使用此方法来创建对其他系统的查询,我需要将列名称指定为字符串数组。对此方法的调用看起来像这样:

var colums = GetColumnSet<Account>(a => new object[] {a.Name, a.AccountNumber});

不,我希望它更像这样:

var colums = GetColumnSet<Account>(a => {a.Name, a.AccountNumber});

没有 new object[]{}但是Expression<Func<T, param object[]>>不编译。

是否可以重写输入表达式来完成这样的语法?

最佳答案

你不能使用你想要的确切语法,但你可以使用匿名对象:

var colums = GetColumnSet<Account>(a => new { a.Name, a.AccountNumber });

你可以像这样实现这个方法:

public string[] GetColumnSet<T>(Expression<Func<T, object>> selector) where T : SomeBaseClass
{
return ((NewExpression)selector.Body)
.Type
.GetProperties()
.Select(prop => typeof(T)
.GetProperty(prop.Name)?
.GetCustomAttribute<OtherSystemAttributeName>()?
.AttributeName)
.Where(name => !string.IsNullOrEmpty(name))
.ToArray();
}

在您的T 对象中不存在的匿名对象中指定的任何属性名称,或者未使用OtherSystemAttributeName 属性修饰的属性将被简单地忽略,这似乎是您追求的行为。

关于c# - 将类的多个属性传递给函数并返回自定义属性的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62834905/

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