更具体/更强大的MemberExpression用于编译时检查?

时间:2015-03-11 10:14:06

标签: c# lambda expression-trees dsl roslyn

考虑下面代码示例中的GetPropertyName方法:

using System;
using System.Linq.Expressions;

namespace SampleApp
{
    public class Program
    {
        public static void Main()
        {
            var name = GetPropertyName<Box, string>(b => b.Position);

            Console.WriteLine(name);
        }

        private static string GetPropertyName<T, TP>(Expression<Func<T, TP>> exp)
        {
            var memberExpression = exp.Body as MemberExpression;

            return memberExpression == null ? null : memberExpression.Member.Name;
        }
    }

    public class Box
    {
        public string Position { get; set; }
    }
}

有没有办法让该方法的参数如此具体,除非传递get + set属性,否则它不会编译?像这样:

private static string GetPropertyName<T, TP>(PropertyExpression<T, TP>> exp) {}

...在编译时修复这样的情况:

var name = GetPropertyName<Box, string>(b => "AAA");

PS:Roslyn会解决这种情况吗?

PPS:上下文:实施严格的内部DSL。

1 个答案:

答案 0 :(得分:4)

  

有没有办法让该方法的参数如此具体,除非传递get + set属性,否则它不会编译?

没有。它只是一个lambda表达式。关于什么样的lambda表达式可以转换为表达式树有一些限制,但没有任何说明它只是一个属性。

  

PS:Roslyn会解决这种情况吗?

好吧,你可以添加一个代码诊断来检查这个......但更好的是,你可以在C#6中使用nameof来避免使用GetPropertyName方法。