C# 动态对象字段作为参数

C# 动态对象字段作为参数,c#,.net,dynamic,C#,.net,Dynamic,我想知道为什么不能将动态对象的字段直接传递给采用相同类型参数的方法 以下是方法签名: public static void LoadPhotoFromS3(string incomingS3Region, string incomingS3Bucket, string incomingS3Key, LogObject logFormatter) 下面是使用声明为“动态”的对象中的字段进行的调用: dynamic s3UploadMessage = JObject.Parse(s3Message

我想知道为什么不能将动态对象的字段直接传递给采用相同类型参数的方法

以下是方法签名:

public static void LoadPhotoFromS3(string incomingS3Region, string incomingS3Bucket, string incomingS3Key, LogObject logFormatter)
下面是使用声明为“动态”的对象中的字段进行的调用:

dynamic s3UploadMessage = JObject.Parse(s3MessageText);
dynamic uploadedFileInfo = s3UploadMessage.Records[0];
var s3Region = uploadedFileInfo.awsRegion;
var s3Bucket = uploadedFileInfo.s3.bucket.name;
PhotoUtils.LoadPhotoFromS3(s3Region, s3Bucket, s3Key, logFormatter);
问题是,当我以这种方式调用它时,会出现编译错误:

与“AP.ePixNextGen.Utils.PhotoUtils.LoadPhotoFromS3(string,string,string,AP.LogUtilities.LogObject)”匹配的最佳重载方法具有一些无效参数

如果执行以下操作,则方法调用将起作用:

PhotoUtils.LoadPhotoFromS3(s3Region.ToString(), s3Bucket.ToString(), s3Key, logFormatter);

解决方法很简单,只是想知道为什么会这样?

s3Region和s3Bucket是动态类型。该方法要求它们的类型为string。由于编译器无法保证s3Region和s3Bucket的类型,因此不能假定它是字符串。

您可以将参数作为对象接收,然后计算是否为字符串,如以下示例所示:

public static void LoadPhotoFromS3(object incomingS3Region, object incomingS3Bucket, object incomingS3Key, LogObject logFormatter)
{
    if (incomingS3Region.GetType() == typeof(string) && incomingS3Bucket.GetType() == typeof(string) && incomingS3Key.GetType() == typeof(string))
    {
        //Your code
    }
}

这是编译错误还是运行时异常?代码编译得很好,至少如您所示,即使没有将
动态
对象强制转换为
字符串
。您可能因为其中一个对象实际上不是
字符串而出现运行时异常,或者您尝试编译的代码存在您这里的示例代码所没有的问题。对于不清楚,我们深表歉意。异常是一个运行时错误,我问这个问题的原因是我知道源动态对象中的s3Region、s3Bucket和s3Key值是字符串。想知道我是否将保存它们的中间值声明为“string”而不是“var”,它们将自动转换?@FredStrauss如果您遇到异常,那么它们显然不是字符串,或者其他参数对方法的签名无效。是,使用
dynamic
时,方法调用不能静态绑定。它需要动态绑定,这正是使用
dynamic
时会发生的情况。我们都忽略了一个事实,因此这应该可以很好地编译。@Selman22您唯一忽略的是说s3region或s3bucket可能实际上不是字符串,这将导致使用该消息的RuntimeBinderExection。