【问题标题】:Dynamic object field as parameter动态对象字段作为参数
【发布时间】:2015-04-18 15:50:54
【问题描述】:

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

这是方法签名:

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);

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

【问题讨论】:

  • 是编译错误还是运行时异常?
  • 代码编译得很好,至少正如您所展示的那样,即使没有将dynamic 对象转换/转换为string。要么你有一个运行时异常,因为其中一个对象实际上不是string,要么你试图编译的代码有你的示例代码没有的问题。
  • 抱歉不清楚。例外是运行时错误,我问这个问题的原因是我知道源动态对象中的 s3Region、s3Bucket 和 s3Key 值是字符串。想知道我是否将保存它们的中间值声明为“字符串”而不是“变量”,它们会自动转换吗?
  • @FredStrauss 如果您遇到异常,那么显然它们不是 not 字符串,该参数或其他参数之一对于方法的签名无效.

标签: c# .net dynamic


【解决方案1】:

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

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
    }
}

【讨论】:

    【解决方案2】:

    s3Region 和 s3Bucket 属于动态类型。该方法要求它们是字符串类型。由于编译器不能保证 s3Region 和 s3Bucket 的类型,所以不能假定它是一个字符串。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    • 1970-01-01
    相关资源
    最近更新 更多