gpt4 book ai didi

c# - 缩短此反射属性名称辅助方法?

转载 作者:行者123 更新时间:2023-11-30 21:23:44 25 4
gpt4 key购买 nike

我想要一个静态辅助方法来删除魔法字符串。当然,我可以将属性方法打包到 TestContainer 中,这样就无需提供 TestContainer 作为参数。这做得很好 here .

但我希望在一个静态类中包含辅助方法,以防我以后决定优化我的代码并删除该方法。我设法把它归结为这个,但它有点难看(必须提供字符串类型,看起来不太好)。

任何知道更好方法的“表达神”。请记住,静态类应该保持通用并且不知道任何关于 TestContainer 的信息(否则它会像提供的链接一样简单)

internal class PropertyNameResolving
{
internal class TestContainer
{
public string LastName { get; set; }
}

internal static class BindingHelper
{
public static string PropertyName<TObject, TValue>(Expression<Func<TObject, TValue>> propertySelector)
{
var memberExpression = propertySelector.Body as MemberExpression;
if (memberExpression != null) return memberExpression.Member.Name;
else
throw new Exception("Something went wrong");
}
}

internal static void Test()
{
var t = new TestContainer {LastName = "Hans"};
Console.WriteLine(BindingHelper.PropertyName<TestContainer, string>(x => x.LastName));
Console.ReadLine();

}
}

顺便说一句,输出是“LastName”,可用于设置绑定(bind)。

还有一个问题,我可以安全地删除 NULL 检查吗?

最佳答案

3 种选择:

  • 使类通用,并在方法上使用推断来获取值
  • 使用示例对象来推断方法
  • 完全忘记对象类型,只用一个例子

这些都显示在下面。关于 null 安全性——我很想检查表达式类型(顺便说一句,你也可以处理方法)——更多代码 shown here .

using System;
using System.Linq.Expressions;
internal class TestContainer
{
public string LastName { get; set; }
}
static class Program
{
static void Main()
{
var t = new TestContainer {LastName = "Hans"};
string s1 = BindingHelper<TestContainer>
.PropertyName(x => x.LastName);
string s2 = BindingHelper.PropertyName(t, x => x.LastName);
string s3 = BindingHelper.PropertyName(() => t.LastName);
}
}
internal static class BindingHelper
{
public static string PropertyName<TObject, TValue>(TObject template,
Expression<Func<TObject, TValue>> propertySelector)
{
var memberExpression = propertySelector.Body as MemberExpression;
if (memberExpression != null) return memberExpression.Member.Name;
else
throw new Exception("Something went wrong");
}
public static string PropertyName<TValue>(
Expression<Func<TValue>> propertySelector)
{
var memberExpression = propertySelector.Body as MemberExpression;
if (memberExpression != null) return memberExpression.Member.Name;
else
throw new Exception("Something went wrong");
}
}
internal static class BindingHelper<TObject>
{
public static string PropertyName<TValue>(
Expression<Func<TObject, TValue>> propertySelector)
{
var memberExpression = propertySelector.Body as MemberExpression;
if (memberExpression != null) return memberExpression.Member.Name;
else
throw new Exception("Something went wrong");
}
}

关于c# - 缩短此反射属性名称辅助方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1580952/

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