- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
考虑下面代码示例中的 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/
我知道如何创建一个 MemberExpression 例如entity.Property // Expression: "entity" var parameter = Expression.Para
我正在尝试使用 Expression.MakeBinary 动态生成二进制表达式: public static BinaryExpression MakeBinary( ExpressionT
假设我有以下代码(我需要在更复杂的表达式中的任何位置包含此代码段)。 Type paraType = typeof(MyModel); var member = paraType.GetMember(
我有这个(在 C# MVC 项目中): public class Bindable { //(...) public IHtmlString FormControlTextField(
这里有人有编写自定义 Linq 提供程序的经验吗? 我想做的是判断作为业务对象属性的 MemberExpression 是否应该包含在 SQL 中,或者作为常量处理,因为它来自恰好是业务对象的局部变量
我们有以下实体: public class Employee { public int Serial { get; set; } public string FullName { ge
我正在尝试编写一个通用函数,它接受一个 MemberExpression 和一个对象,并返回成员表达式中定义的属性的值。 这是获取属性名称的代码示例。 public static TProperty
我正在为 MVC 创建一个表单生成器,我想通过以下方式模拟 Razor 对链式属性的处理: builder.TextBoxFor(x => x.User.Email); 这将以与 Razor 相同的方
想象一下以下类: class A { public string Test {get; set;} } class B : A { .. some other members .. }
我们正在努力使在我们系统的所有区域编写强类型代码变得容易,而不是设置 var sortColumn = "FirstName"我们想说sortOption = (p => p.FirstName) .
我需要帮助。我有两个类:实体和模型。他们的代码如下。 public class TestEntityForSerialize { public String FIO { get; set; }
我问类似的问题here,假设这种类型: public class Product { public string Name { get; set; } public string Title { g
给定这段代码: static void Main(string[] args) { Expression> test = i => i.Prop; var body = (UnaryE
所以,假设我在 C# 中有以下表达式: Expression> expr = () => foo.Bar; 如何提取对 foo 的引用? 最佳答案 I had the same problem, bu
描述 我有一个表达式指向我的类型的属性。但它不适用于所有属性类型。 "不是意思"是什么意思它导致不同的表达类型。我以为它会导致MemberExpression 但事实并非如此。 对于 int 和 Gu
根据我的 Select a model property using a lambda and not a string property name 的答案采取行动问题,想要向集合添加属性,如下所示:
我希望使用表达式树创建以下 Linq 表达式: var result2 = soldiers.OrderByDescending(soldier => soldier.Ranks.OrderBy(r=
我正在处理一个 linq 查询,并尝试按照 Mutilevel include in C# Linq 中的建议将实体包含到多个级别. 所以我写下这样的查询 query.Include(u => u.
以下成员表达式类型有时可以为 Nullable,我正在检查,但是我需要将其转换为不可为 null 的类型, MemberExpression member = Expression.Property(
下面的表达式将属性 NAME 与值 PETER 进行比较。 ParameterExpression pe = Expression.Parameter(typeof(T), "
我是一名优秀的程序员,十分优秀!