如何使用动态的这个公共静态方法?

时间:2014-02-18 20:35:34

标签: c# asp.net

我看到这可以用来从Web服务中获取,但我不确定如何调用它。

public static class IDSSExtensions
{
    public static T SetCredentials<T>(this T aServiceType)
    {        
        dynamic theDynamic = aServiceType;
        theDynamic.UserName = "Username";
        theDynamic.Password = "Password";
        return aServiceType = theDynamic;
    }
}

这样的事情,我假设:IDSSExtensions.SetCredentials<>;

但是,需要在<>之间进行某些操作,但是什么呢? aServiceType

我有一个WebReference,其命名空间为:ServiceMembersIDSS,但如果我把它放在那里,那将无法正常工作并出错。那里有什么?

例如,可以像这样使用:

而不是:

private AuthorizeHeader IDSSCredentials()
{
    ServiceMemberIDSS.AuthorizeHeader _authHeader = new ServiceMemberIDSS.AuthorizeHeader();
    _authHeader.UserName = "Username";
    _authHeader.Password = "Password";
    return _authHeader;
}

我可以这样做:

private AuthorizeHeader IDSSCredentials()
{
    ServiceMemberIDSS.AuthorizeHeader _authHeader = new ServiceMemberIDSS.AuthorizeHeader();
    _authHeader.SetCredentials();
    return _authHeader;
}

这是对的吗?

1 个答案:

答案 0 :(得分:2)

这是一个非常奇怪的代码块,但是这里有:

这里对任何类型的对象都是通用的。静态类和方法中的“this”语法使其成为扩展方法。由于这是T的扩展方法,没有约束,包括此文件会将此方法添加到所有对象中。因此,您可以在任何对象上从技术上调用此方法:

Object foo = new Object();
foo.SetCredentials();

然而,动态强制转换假定您的对象具有两个属性UserName和Password。如果对象没有这些属性,那么它将抛出异常。该方法应该采用具有UserName和Password属性的接口,而不是T.当然,只需创建自己的具有UserName和Password属性的对象,就可以无异常地调用该方法。

public class MyObject
{
    public String UserName { get; set; }
    public String Password { get; set; }
}

MyObject myObject = new MyObject();
myObject.SetCredentials();