gpt4 book ai didi

c# - 作为代码片段/模板的内联函数

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

编辑:基本上我希望能够使用以下机制来回答我原来的问题:

void MethodA()
{
MethodB();

//This code will never be reached because 'return' from the inline MethodB is executed.

//... More code here
}

[Attribute(Inline)]
ReturnValue MethodB()
{
return;
}

当然上面的例子本身是没有用的,更多的逻辑当然会放在 MethodB 中,但为了简洁我把它放在一边了。

原始问题:在已经开发了 1 年的项目中,选择执行以下操作。每个函数都不会抛出异常,而是返回一个 ReturnValue<T>IsSuccessFul bool 标志生活。是这样使用的

var methodResult = MyMethod();
if (!methodResult .IsSuccesful)
{
return new ReturnValue<Type>(methodResult .ThrownException);
}
var value= methodResult.Value;

这种调用方法的方式用在了项目中的每一个公共(public)函数上。您可以想象这需要比 var value = MyMethod(); 更多的代码行使用通用的 try catch。特别是如果在一个范围内调用了十几个公共(public)函数。

请不要与所选择的设计争论,我不是来争论这是否是一个好的选择。

我想知道的是:有什么办法可以做到这一点

var value= TryMethod(MyMethod);

并且编译器或某些插件或其他任何东西将此预编译时间转换为前面显示的完整模式。我的观点是,如果 !IsSuccessFul 函数应该返回。我可以编写一个预编译时间命令来为我执行此操作,但我希望使用 VisualStudio 本身的某种片段/模板/内联方式。

谢谢。

最佳答案

应该像(对于模式一样简单 - 当然这在这里是相当无用的,因为它基本上是身份,只是它会重新创建另一个 ReturnValue<T> - 所以不建议):

public static ReturnValue<T> TryMethod<T>(Func<ReturnValue<T>> method)
{
var methodResult = method();
if (!methodResult .IsSuccesful)
return new ReturnValue<T>(methodResult.ThrownException);

// I can only guess at this:
return methodResult;
}

但根据您的使用情况,我认为您确实想要:

public static T TryMethod<T>(Func<ReturnValue<T>> method)
{
var methodResult = method();
if (!methodResult .IsSuccesful)
throw methodResult.ThrownException;

return methodResult.Value;
}

当然,您可能必须进行多次重载(当您的方法采用参数时 - 例如:

public static T TryMethod<T,P>(Func<P,ReturnValue<T>> method, P p)
{
var methodResult = method(p);
// ...

您可能希望将它们放入静态扩展类中并执行:

public static T TryMethod<T>(this Func<ReturnValue<T>> method)

这样你就可以写

var value = MyMethod.TryMethod();

等等。

让它成为 Monadic

总体而言,您的设计可能还不错,但您应该考虑将常用的 functor-map 和 mondic-bind 操作(您甚至可以在执行 SelectMany 时使用 LINQ)添加到 ReturnValue<T> 中输入:

public static ReturnValue<B> Map<A,B>(this ReturnValue<a> v, Func<A,B> f)
{
if (v.IsSuccesful) return new ReturnValue<B>(f(v.Value));
return new ReturnValue<B>(v.ThrownException);
}

public static ReturnValue<B> Bind<A,B>(this ReturnValue<a> v, Func<A,ReturnValue<B>> f)
{
if (v.IsSuccesful) return f(v.Value);
return new ReturnValue<B>(v.ThrownException);
}

Bind 的用法示例

使用这个 Bind在这里你可以这样做,我认为这就是你对范围的意思:

method().Bind(
value => {
// ... whatever you want to do with value - just return a ReturnValue<> at the end
});

关于c# - 作为代码片段/模板的内联函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30295705/

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