据我了解,每种语言都可以拥有自己的dynamic
处理程序,因此适用相应的规则.我不确定以下是否正确/不正确; 想法?
场景:使用一些方法的两个接口(一个实现另一个):
public interface IA {
void Bar(object o);
}
public interface IB : IA {
void Foo(object o);
}
Run Code Online (Sandbox Code Playgroud)
和一个基本的实现:
public class B : IB {
public void Foo(object o) { Console.WriteLine("Foo"); }
public void Bar(object o) { Console.WriteLine("Bar"); }
}
Run Code Online (Sandbox Code Playgroud)
现在,使用正常的C#(no dynamic
),我们可以IA
从类型的目标访问方法IB
:
IB b = new B();
var o = new { y = "z" };
b.Foo(o.y); // fine
b.Bar(o.y); // fine
Run Code Online (Sandbox Code Playgroud)
现在让我们故意dynamic
在参数中添加一些,这使得整个调用都使用dynamic
处理(在一般情况下,这可能会影响重载解析,尽管它不会在这里):
IB …
Run Code Online (Sandbox Code Playgroud) ChannelFactory
如果我提供正确类型的动态对象,则挂起.
dynamic src = "MSFT";
var binding = new BasicHttpBinding();
var endpoint = new EndpointAddress("http://www.restfulwebservices.net/wcf/StockQuoteService.svc");
var channel = new ChannelFactory<IStockQuoteService>(binding, endpoint).CreateChannel();
// this will print just fine
Console.WriteLine(channel.GetStockQuote(src as string));
// this will print just fine
Console.WriteLine(new StockQuoteServiceClient().GetStockQuote(src));
// this will never print and the application will hang with no exceptions
Console.WriteLine(channel.GetStockQuote(src));
Run Code Online (Sandbox Code Playgroud)
StockQuoteServiceClient
是由Add Service Reference菜单项创建的,并且使动态对象很好;channel.GetStockQuote(src)
;ChannelFactory
的动态对象时挂起,如注释中所述.ChannelFactory
当添加服务引用创建的那个运行得很好时,为什么我将动态对象作为参数挂起?
我有以下两个接口:
public interface IMembershipProvider
{
object Login(ILoginProviderParameters loginParameters);
void SetAuthCookie(string userName, bool createPersistentCookie);
}
public interface IFacebookMembershipProvider : IMembershipProvider{}
Run Code Online (Sandbox Code Playgroud)
和一个实现:
public class FacebookMembershipProvider: IFacebookMembershipProvider
{
public object Login(ILoginProviderParameters loginParameters)
{
// Facebook login code is here
}
public void SetAuthCookie(string userName, bool createPersistentCookie)
{
FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
}
}
Run Code Online (Sandbox Code Playgroud)
这被注入我的控制器并分配给:
private readonly IFacebookMembershipProvider _facebookMembershipProvider;
Run Code Online (Sandbox Code Playgroud)
我可以Login
毫无问题地调用该方法,但是当我调用该SetAuthCookie
方法时:
_facebookMembershipProvider.SetAuthCookie(user.id, false);
Run Code Online (Sandbox Code Playgroud)
我收到错误:
MyNamespace.UserManagement.Interfaces.IFacebookMembershipProvider' 不包含 'SetAuthCookie' 的定义
我用 Login 方法做了什么与我没有用 SetAuthCookie 方法做的不同?
显式转换为类型IMembershipProvier
工作正常:
((IMembershipProvider)_facebookMembershipProvider).SetAuthCookie(user.id, false);
Run Code Online (Sandbox Code Playgroud)
我可能只是错过了一些基本的东西。谢谢参观。
更新
在回答 Marks 问题时,传递给该 …