C# 是否缩短此反射属性名称帮助器方法?

C# 是否缩短此反射属性名称帮助器方法?,c#,reflection,properties,C#,Reflection,Properties,我想要一个静态的助手方法来移除神奇的字符串。当然,我可以将property方法打包到TestContainer中,这样就不需要将TestContainer作为参数提供。这做得很好 但是我希望将helper方法放在一个静态类中,以防以后决定优化代码并删除该方法。我设法做到了这一点,但它有点难看(必须提供字符串类型,看起来不是很好) 任何“上帝”的表达都知道更好的方式。请记住,静态类应该保持通用性,并且不知道关于TestContainer的任何信息(否则它将与提供的链接一样简单) 内部类属性名称解析

我想要一个静态的助手方法来移除神奇的字符串。当然,我可以将property方法打包到TestContainer中,这样就不需要将TestContainer作为参数提供。这做得很好

但是我希望将helper方法放在一个静态类中,以防以后决定优化代码并删除该方法。我设法做到了这一点,但它有点难看(必须提供字符串类型,看起来不是很好)

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

内部类属性名称解析
{
内部类TestContainer
{
公共字符串LastName{get;set;}
}
内部静态类BindingHelper
{
公共静态字符串PropertyName(表达式propertySelector)
{
var memberExpression=propertySelector.Body作为memberExpression;
if(memberExpression!=null)返回memberExpression.Member.Name;
其他的
抛出新异常(“出错”);
}
}
内部静态孔隙试验()
{
var t=newtestcontainer{LastName=“Hans”};
WriteLine(BindingHelper.PropertyName(x=>x.LastName));
Console.ReadLine();
}
}
顺便说一句,输出为“LastName”,可用于设置绑定


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

因为编译器可以暗示类型参数,所以不需要在Test()方法中提供任何内容而不进行任何更改

使用BindingHelper.PropertyName(x=>x.LastName),它应该可以正常工作

您无法安全地删除空检查,因为您的表达式可以是任何内容,包括方法调用,但不能算作MemberExpression。

3选项供您选择:

  • 将类设为泛型,并对值的方法使用推断
  • 使用示例对象对方法进行推理
  • 完全忘记对象类型,只使用一个示例
这些都显示在下面。关于
null
safety-我会尝试检查表达式类型(顺便说一句,您也可以处理方法)-更多的代码

使用系统;
使用System.Linq.Expressions;
内部类TestContainer
{
公共字符串LastName{get;set;}
}
静态类程序
{
静态void Main()
{
var t=newtestcontainer{LastName=“Hans”};
字符串s1=BindingHelper
.PropertyName(x=>x.LastName);
字符串s2=BindingHelper.PropertyName(t,x=>x.LastName);
字符串s3=BindingHelper.PropertyName(()=>t.LastName);
}
}
内部静态类BindingHelper
{
公共静态字符串PropertyName(ToObject模板,
表达式属性选择器)
{
var memberExpression=propertySelector.Body作为memberExpression;
if(memberExpression!=null)返回memberExpression.Member.Name;
其他的
抛出新异常(“出错”);
}
公共静态字符串PropertyName(
表达式属性选择器)
{
var memberExpression=propertySelector.Body作为memberExpression;
if(memberExpression!=null)返回memberExpression.Member.Name;
其他的
抛出新异常(“出错”);
}
}
内部静态类BindingHelper
{
公共静态字符串PropertyName(
表达式属性选择器)
{
var memberExpression=propertySelector.Body作为memberExpression;
if(memberExpression!=null)返回memberExpression.Member.Name;
其他的
抛出新异常(“出错”);
}
}

我想说空检查是不必要的,因为如果失败,无论如何都会抛出空检查。不,这不起作用。。尝试:-)“无法从用法推断…”错误。我将看一看Marcs的解决方案。“我想要一个静态的助手方法来删除神奇的字符串。”我不明白这一点。你想做什么?@silky:支持重构,特别是在开发过程中,但仍将我所做的所有引用保留在一个文件中(查找用法),以便在以后删除(如果性能太差)@Itay:我花了一分钟才明白你的意思。这是一个测试类,别担心,不是我的正常风格…谢谢,我最喜欢方法1。。。我相信我以后会在BindingHelper中做其他事情,无论如何,让这个类可用也无妨。而且看起来很不错。。
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();

    }
}
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");
    }
}