gpt4 book ai didi

c# - Lambda 表达式 `x => x.Property` 更改为 `x => Convert(x.Property)`

转载 作者:太空狗 更新时间:2023-10-29 20:16:27 32 4
gpt4 key购买 nike

我有一个 sample Data

public class Data
{
public int TestInt { get; set; }
public bool TestBool { get; set; }
public string TestString { get; set; }

public Data() { TestInt = 10; TestBool = true; TestString = "test"; }
}

还有一个扩展方法

public static void Method<T>(this T item, params Expression<Func<T, object>>[] properties)
{
/* Some stuff */
}

我是这样用的

Data data = new Data();
data.Method(x => x.TestInt, x => x.TestBool, x => x.TestString);

我的 Method<T>确实收到 3 个属性,但它已略微更改为:

properties[0] = x => Convert(x.TestId);
properties[1] = x => Convert(x.TestBool);
properties[2] = x => x.TestString;

如您所见,TestString部分不变。我尝试将属性更改为 params Expression<Func<T, bool>>[]params Expression<Func<T, int>>[]并且只传递相应的参数就可以正常工作。我知道问题来自转换成 object但我想不通。

最佳答案

由于 Int32Boolean 都不是引用类型,因此整个表达式树需要将它们显式转换为 object

有一些隐式操作在编译时使用常规 C# 编译器可用,而其他一些操作在实现表达式树时需要显式操作。

你想测试一下自己吗?

public struct A {}
public class B { }

public class C
{
public A A { get; set; }
public B B { get; set; }
}

C c = new C();
Expression<Func<C, object>> expr1 = some => some.A; // Convert(some.A)
Expression<Func<C, object>> expr2 = some => some.B; // some.B

归根结底,常规 C# 编译器会实现一些诡计 来转换值类型以适应object(引用类型)。也许 Eric Lippert 回答的这个问答“How do ValueTypes derive from Object (ReferenceType) and still be ValueTypes?”对您来说可能很有趣。

OP 说...

Isn't there any way to force the Expression to remain untouched?

没有。您应该处理这两种情况:使用和不使用强制转换访问属性。

关于c# - Lambda 表达式 `x => x.Property` 更改为 `x => Convert(x.Property)`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33100642/

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