动态对象字段作为参数

时间:2015-02-17 20:05:39

标签: c# .net dynamic

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

这是方法签名:

public static void LoadPhotoFromS3(string incomingS3Region, string incomingS3Bucket, string incomingS3Key, LogObject logFormatter)

这是使用声明为'dynamic'的对象中的字段进行的调用:

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

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

2 个答案:

答案 0 :(得分:-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
    }
}

答案 1 :(得分:-2)

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