gpt4 book ai didi

c# - 更具体/更强的 MemberExpression 用于编译时检查?

转载 作者:太空宇宙 更新时间:2023-11-03 21:23:26 24 4
gpt4 key购买 nike

考虑下面代码示例中的 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。

最佳答案

Is there any way of making that method's parameter so specific that it wouldn't compile unless a get+set property is being passed?

没有。这只是一个 lambda 表达式。对于什么样的 lambda 表达式可以转换为表达式树有限制,但没有说它必须是一个属性。

PS: will Roslyn fix this situation?

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

关于c# - 更具体/更强的 MemberExpression 用于编译时检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28983787/

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