如何用powershell 声明interface


0
sinp000 asked 8 年 ago

我用 [System.Reflection.Assembly]::LoadFrom (\’D:\\Test\\DTS.dll‘)加载了dll 。
已经可用New-Object  建立dll内大部分类的对象了。
但是New-Object T2Sdk 这个类不行。
T2Sdk的构造函数是 T2Sdk([ IT2Handler hanler =null ]) ,
而IT2Handler 是接口 interface。
不知道这段T2Sdk t2sdk = new T2Sdk() 用powershell如何实现。

1 Answers
1
Best Answer
Mooser Lee 管理员 answered 8 年 ago

按照构造函数IT2Handler 是个可选参数应当可以不传。
另外在c#中任何时候都不能初始化一个接口,而是找到实现了该接口的非抽象类进行初始化,然后把初始化的对象用到需要它的接口的地方。

就像我在另一篇帖子system.string的方法问题中回答的一样,IConvertible.ToDateTime(System.IFormatProvider provider)中的IFormatProvider是一个接口,我们得找到或者初始化一个实现这个接口的个实例。

 

我在C#中模拟了这么一段定义:

 public interface IT2Handler
 {
 }

 public class T2Sdk
 {
 public T2Sdk(IT2Handler handler=null)
 {
 }
 }

然后在PowerShell中实验的结果如下:

 

[PStips.Net.IT2Handler]$handler

PS> New-Object PStips.Net.T2Sdk -ArgumentList @($handler)
PStips.Net.T2Sdk

PS> New-Object PStips.Net.T2Sdk -ArgumentList @($null)
PStips.Net.T2Sdk



PS> New-Object PStips.Net.T2Sdk -ArgumentList $null
New-Object : A constructor was not found. Cannot find an appropriate constructor for type PStips.Net.T2Sdk.
At line:1 char:1
+ New-Object PStips.Net.T2Sdk -ArgumentList $null
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (:) [New-Object], PSArgumentException
+ FullyQualifiedErrorId : CannotFindAppropriateCtor,Microsoft.PowerShell.Commands.NewObjectCommand

这说明一个问题,如果给New-Object 不传参数,或者传递一个null,PowerShell解释器都会认为你调用的无参数构造函数,显然该类型没有无参数构造函数。所以至少需要我们传递一个数组,数组中可以只包含一个元素,哪怕那个元素是null。这样Powershell解释器就会匹配那个有一个参数的构造函数。

形如:PS> New-Object PStips.Net.T2Sdk -ArgumentList @($null)

或者:New-Object PStips.Net.T2Sdk -ArgumentList @($handler)

sinp000 replied 8 年 ago

感谢回复。
我直接用 new-object T2Sdk 不带参数的时候,ps会报不存在对应的构造函数(唯一的构造函数是public T2Sdk([IT2Handler handler = null]) ,是不是ps不支持默认参数?怎么给对象赋值为null?)
这个参数默认是null,应该没有“实现这个接口的个实例”,类似ToDateTime(System.IFormatProvider provider)中的IFormatProvider。
c#代码里原来代码是这样的,T2Sdk t2sdk = new T2Sdk()。
然后我改成T2.IT2Handler hdl = null;
T2Sdk t2sdk = new T2Sdk(hdl)
也是可以编译通过的。我在想ps能不能仿写这段。
c#我比较模糊,我想法是调用dll里的通讯方法,通过ps去处理数据。

Mooser Lee 管理员 replied 8 年 ago

已在原答案上更新。

sinp000 replied 8 年 ago

非常感谢大牛,就是 -ArgumentList @($null) 。
看来我应该多补补ps基础,之前我怎么试,也没想到用@($null)。