gpt4 book ai didi

c# - 如何拆分多个级别的成员访问权限

转载 作者:太空宇宙 更新时间:2023-11-03 15:57:08 25 4
gpt4 key购买 nike

假设我定义了这些虚拟类:

public class MyObject
{
public InterestingFact InterestingFact { get; set; }
}
public class InterestingFact
{
public Detail Detail { get; set; }
}
public class Detail
{
public string Information { get; set; }
}

我还有一个 MyObject 的实例:

var obj = new MyObject() { InterestingFact = new InterestingFact() };

如果我想尝试访问 Information属性(property),我可以做这样的事情:

string info = null;
if (obj != null
&& obj.InterestingFact != null
&& obj.InterestingFact.Detail != null)
{
info = obj.InterestingFact.Detail.Information;
}

为了本次讨论,请忽略 Demeter 法则,每次我想访问我拥有的对象深处的某些内容时,这都不是一件很有趣的事情。当然,我可以创建一个扩展方法:

public static U NullOr<T, U>(this T target, Func<T, U> selector)
{
if (EqualityComparer<T>.Default.Equals(target, default(T)))
{
return default(U);
}
return selector(target);
}

这使得选择数据更容易一些:

// Here I have a null of type string.
var info = obj.NullOr(o => o.InterestingFact).NullOr(f => f.Detail).NullOr(d => d.Information);

不过,这还是有点啰嗦。理想情况下,我想做更多像这样的事情:

// Here I should still have a null of type string.
var info = obj.NullOr(o => o.InterestingFact.Detail.Information);

我从未使用过 Expression ;如果我接受 Expression<Func<T, U>>而不是 Func<T, U>NullOr ,在我看来它是一个成员访问权限而不是三个。有没有办法解决上述问题,或者这个公式是否遥不可及?

(当然,还有对最后一个公式的担忧,即发送的表达式可能不仅仅是链式成员访问......)

最佳答案

以下是使用扩展方法实现所需结果的最简单方法。

public static class ExtensionMethods
{
public static TR DefaultIfNull<T, TR>(this T source, Expression<Func<T, TR>> expr, TR defaultValue = default(TR))
{
TR result = defaultValue;

try
{
result = expr.Compile().Invoke(source);
}
catch (NullReferenceException)
{
// DO NOTHING
}

return result;
}
}

下面是上面的一些用法示例

var info1 = obj.DefaultIfNull(x => x.InterestingFact.ToString(), "Null1");
var info2 = obj.DefaultIfNull(x => x.InterestingFact.Detail.ToString(), "Null2");
var info3 = obj.DefaultIfNull(x => x.InterestingFact.Detail.Information);

请注意,这不是最佳解决方案,因为它不会检查单个表达式节点是否为 null,因此如果树中的任何节点恰好在内部生成 NullReferenceException那么将返回默认值而不是抛出异常。然而,对于一般和简单的使用,这可能是最佳解决方案(主要是因为它的简单性)。

关于c# - 如何拆分多个级别的成员访问权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23146829/

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