gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:58:55 24 4
gpt4 key购买 nike

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

enter image description here

更新:对不起,乔恩:

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 类型,这意味着表达式被认为是动态的-绑定(bind)表达式,不管其他什么。

这是一个简短但完整的例子来证明我的意思:

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的类型是动态

即使在执行时只有一种可能的方法可以被绑定(bind) - 即使该绑定(bind)将始终有效 - 基本规则是几乎任何涉及 dynamic 值的表达式被视为属于 dynamic 类型。 (有一些异常(exception),例如 asnew。)

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

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

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

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

关于c# - 为什么尽管签名中有返回类型,但此方法仍保持动态返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25586520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com