相关疑难解决方法(0)

基于接口的方法是否应该调用使用"动态"仍遵循C#方法解析规则?

据我了解,每种语言都可以拥有自己的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)

c# dynamic

17
推荐指数
1
解决办法
408
查看次数

带有动态参数的ChannelFactory错误

此问题与动态语言运行时中的Bug以及IIS 7.5相关

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菜单项创建的,并且使动态对象很好;
  • 当我在Debug上使用F5启动应用程序时,这种神奇不会发生,所有行打印并且程序正确退出;
  • 如果我运行它然后在执行期间附加调试器,我可以看到它挂在调用上channel.GetStockQuote(src);
  • 如果我离开它,程序会占用我所有的记忆;
  • 它只会在我使用自己ChannelFactory的动态对象时挂起,如注释中所述.

ChannelFactory当添加服务引用创建的那个运行得很好时,为什么我将动态对象作为参数挂起?

.net wcf wcf-client channelfactory c#-4.0

8
推荐指数
1
解决办法
323
查看次数

接口不包含方法的定义

我有以下两个接口:

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 问题时,传递给该 …

c# interface

3
推荐指数
1
解决办法
1998
查看次数

标签 统计

c# ×2

.net ×1

c#-4.0 ×1

channelfactory ×1

dynamic ×1

interface ×1

wcf ×1

wcf-client ×1