gpt4 book ai didi

dynamic - 使用C#4对动态对象进行鸭子类型(duck typing)测试

转载 作者:行者123 更新时间:2023-12-03 08:49:20 26 4
gpt4 key购买 nike

我想在C#中使用动态对象编写一个简单的鸭子输入示例。在我看来,动态对象应该具有HasValue / HasProperty / HasMethod方法,该方法具有单个字符串参数,用于表示您要尝试对其进行操作的值,属性或方法的名称。我正在尝试避免try / catch块,并在可能的情况下进行更深入的思考。这似乎是在动态语言(JS,Ruby,Python等)中进行鸭子键入的一种常见做法,即在尝试使用属性/方法之前先对其进行测试,然后返回默认值或引发受控异常。下面的示例基本上是我想要完成的。

如果上述方法不存在,那么有人可以为动态预先创建扩展方法吗?

示例:在JavaScript中,我可以相当容易地测试对象上的方法。

//JavaScript
function quack(duck) {
if (duck && typeof duck.quack === "function") {
return duck.quack();
}
return null; //nothing to return, not a duck
}

我将如何在C#中执行相同的操作?
//C# 4
dynamic Quack(dynamic duck)
{
//how do I test that the duck is not null,
//and has a quack method?

//if it doesn't quack, return null
}

最佳答案

尝试这个:

    using System.Linq;
using System.Reflection;
//...
public dynamic Quack(dynamic duck, int i)
{
Object obj = duck as Object;

if (duck != null)
{
//check if object has method Quack()
MethodInfo method = obj.GetType().GetMethods().
FirstOrDefault(x => x.Name == "Quack");

//if yes
if (method != null)
{

//invoke and return value
return method.Invoke((object)duck, null);
}
}

return null;
}

或此(仅使用动态):
    public static dynamic Quack(dynamic duck)
{
try
{
//invoke and return value
return duck.Quack();
}
//thrown if method call failed
catch (RuntimeBinderException)
{
return null;
}
}

关于dynamic - 使用C#4对动态对象进行鸭子类型(duck typing)测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2985161/

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