在下面的代码片段中,我不明白" //失败"下面的代码与" //下面的代码之间的差异" (在创建Azure函数时作为样板代码提供。)注意:我意识到对象的强制转换是不必要的,但ReadAsAsync返回对象....
public static class FunctionTest
{
[FunctionName("TestFunction")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req, TraceWriter log)
{
log.Info("C# HTTP trigger function processed a request.");
// parse query parameter
string name = req.GetQueryNameValuePairs()
.FirstOrDefault(q => string.Compare(q.Key, "name", true) == 0)
.Value;
//if nothing in the query parameter - lets' look into the body
if (name == null)
{
//this fails
dynamic abc = (object) @"{""name"":""test""}";
string test = abc?.name;
// this works
dynamic data = await req.Content.ReadAsAsync<object>();
name = data?.name;
}
return name == null
? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name on the query string or in the request body")
: req.CreateResponse(HttpStatusCode.OK, "Hello " + name);
}
}
答案 0 :(得分:3)
第一行:
dynamic abc = (object) @"{""name"":""test""}";
将获取string
值并将其转换为object
。这并不意味着它会将字符串视为JSON并创建一个具有name
属性的新动态对象。它仍然是string
,内容并不重要。
然而第二行:
dynamic data = await req.Content.ReadAsAsync<object>();
使用通用类型ReadAsAsync
调用object
方法。这实际上为object
转换为name = data["name"];
,具有各种属性意味着您可以执行此操作:
dynamic
因为它是dynamic
,所以有效地将您的代码转换为上述代码。但是,几乎每次我看到public class Foo {
public string Name { get; set; }
}
时,它都会产生代码味道,这没什么区别。而是使用正确的属性创建一个具体的类并使用它。这样,您将进行编译时类型检查,而不是依赖于动态对象。例如:
Foo data = await req.Content.ReadAsAsync<Foo>();
并像这样使用它:
{{1}}