为什么尽管签名中有返回类型,但该方法仍保持动态返回?

2023-12-21

因此,激活器返回的类型(此处未显示)只是我创建的 POCO。没什么特别的。但尽管如此,返回类型GetWrapper or GetWrapper<T>返回的对象是动态类型的,因此智能感知看不到返回的实际类的任何属性。有任何想法吗?

更新: 对不起,乔恩:

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

我强烈怀疑child1 or child1.kind属于类型dynamic,这意味着无论其他情况如何,该表达式都被视为动态绑定表达式。

这是一个简短的但是complete举例说明我的意思:

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 is string- 但后面的语句没问题,因为类型d is dynamic.

尽管只有一种可能的方法could在执行时绑定 - 即使该绑定始终有效 - 基本规则是几乎any表达式涉及一个dynamicvalue 被认为是类型dynamic。 (有一些例外,例如as and new.)

要使您的返回值非动态,只需将您的值转换为object:

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

现在这将是一个静态地绑定调用。或者您可以将其保留为动态绑定调用,并使用类型表达式的隐式转换dynamic到其他类型:

LinkWrapper obj = RedditDynamicObjectWrapperFactory.GetWrapper<LinkWrapper>(child1.kind, child1);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么尽管签名中有返回类型,但该方法仍保持动态返回? 的相关文章

随机推荐