簡體   English   中英

盡管簽名中有返回類型,為什么此方法會繼續返回動態?

[英]Why does this method keep returning dynamic despite the return type in the signature?

因此激活器返回的類型(此處未顯示)只是我創建的POCO。 沒什么特別的。 但是,盡管GetWrapperGetWrapper<T>的返回類型返回的對象是動態類型的,因此intellisense不會看到返回的實際類的屬性。 有任何想法嗎?

在此輸入圖像描述

更新:對不起,喬恩:

public static T GetWrapper<T>(object type, dynamic obj)
   where T : class, IRedditObject
{
    return GetWrapper(type, obj) as T;
}

public static object GetWrapper(object type, dynamic obj)
{
    return Activator.CreateInstance(Types[type.ToString()], obj);
}

public class LinkWrapper : IRedditObject
{
    private readonly dynamic _link;

    public string Kind { get { return "t3"; } }
    public dynamic Data { get { return _link.data; } }

    public LinkWrapper(dynamic link)
    {
        _link = link;
    }

    public string Domain { get { return Data.domain; } }
}

[TestMethod]
public void Test()
{
    var proxy = new SubredditProxy();
    var dotnet = proxy.GetSubredditAsync("dotnet").Result;

    var child1 = dotnet.data.children[0];

    // this is being returned as dynamic
    var obj = RedditDynamicObjectWrapperFactory.GetWrapper<LinkWrapper>(child1.kind, child1);


    Assert.IsNotNull(obj);
}

我強烈懷疑,要么child1child1.kind有型的dynamic ,這意味着表達被認為是一個動態綁定的表達,盡管一切。

這是一個簡短而完整的例子來證明我的意思:

using System;

class Test
{
    public static T Foo<T>(object x)
    {
       return default(T);
    }

    public static void Main(string[] args)
    {
        object a = new object();
        dynamic b = a;

        var c = Foo<string>(a);
        var d = Foo<string>(b);

        Console.WriteLine(c.SomeRandomMember); // Invalid
        Console.WriteLine(d.SomeRandomMember); // Valid
    }
}

無效的語句是無效的,因為c的類型是string -但隨后的語句是好的,因為d的類型是dynamic

即使只有一種可能的方法可以在執行時綁定到該方法-即使該綁定將始終有效-基本規則是幾乎所有涉及dynamic值的表達式都被視為類型dynamic (有一些例外,例如asnew 。)

要使返回值不動態,只需將值轉換為object

var obj = RedditDynamicObjectWrapperFactory.GetWrapper<LinkWrapper>
     ((object) child1.kind, (object) child1);

現在這將是一個靜態約束的電話。 或者,您可以將其保留為動態綁定的調用,並使用從dynamic類型的表達式到其他類型的隱式轉換:

LinkWrapper obj = RedditDynamicObjectWrapperFactory.GetWrapper<LinkWrapper>(child1.kind, child1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM