考虑下面代码示例中的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。
答案 0 :(得分:4)
有没有办法让该方法的参数如此具体,除非传递get + set属性,否则它不会编译?
没有。它只是一个lambda表达式。关于什么样的lambda表达式可以转换为表达式树有一些限制,但没有任何说明它只是一个属性。
PS:Roslyn会解决这种情况吗?
好吧,你可以添加一个代码诊断来检查这个......但更好的是,你可以在C#6中使用nameof
来避免使用GetPropertyName
方法。