首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果一个类还没有被添加,我如何有条件地添加一个具有Add-Type -TypeDefinition的类?

如果一个类还没有被添加,我如何有条件地添加一个具有Add-Type -TypeDefinition的类?
EN

Stack Overflow用户
提问于 2013-05-15 05:02:05
回答 4查看 16.9K关注 0票数 50

请考虑以下PowerShell代码片段:

代码语言:javascript
复制
$csharpString = @"
using System;

public sealed class MyClass
{
    public MyClass() { }
    public override string ToString() {
        return "This is my class. There are many others " +
            "like it, but this one is mine.";
    }
}
"@
Add-Type -TypeDefinition $csharpString;
$myObject = New-Object MyClass
Write-Host $myObject.ToString();

如果我在同一个AppDomain中多次运行该脚本(例如,在powershell.exe或powershell_ise.exe中运行该脚本两次),我会得到以下错误:

代码语言:javascript
复制
Add-Type : Cannot add type. The type name 'MyClass' already exists.
At line:13 char:1
+ Add-Type -TypeDefinition $csharpString;
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (MyClass:String) [Add-Type],
 Exception
    + FullyQualifiedErrorId :
 TYPE_ALREADY_EXISTS,Microsoft.PowerShell.Commands.AddTypeCommand

如何包装对Add-Type -TypeDefinition的调用,使其只被调用一次?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-04 04:34:50

这个技巧对我来说很有效:

代码语言:javascript
复制
if (-not ([System.Management.Automation.PSTypeName]'MyClass').Type)
{
    Add-Type -TypeDefinition 'public class MyClass { }'
}

DateTime类型名可以用引号引起来,也可以用方括号'Assembly').

  • I've括起来,也可以用方括号MyClass括起来(仅限v3+)。

  • 类型名查找不是DateTime必须使用类型的全名,除非它是系统命名空间的一部分(例如,System.DateTime可以通过‘case-sensitive.

  • You’查找,但不能通过DateTime查找仅在Win8.1中测试过这个;PowerShell v2,v3,v4。

在内部,PSTypeName类调用处理繁重任务的LanguagePrimitives.ConvertStringToType()方法。它在成功时缓存查找字符串,因此额外的查找速度更快。

我还没有确认x0n和Justin D提到的内部是否抛出了任何异常。

票数 55
EN

Stack Overflow用户

发布于 2014-03-04 07:42:56

实际上,这些都不是必需的。Add-Type维护一个缓存,其中包含您提交给它的任何代码以及结果类型。如果您使用相同的代码调用Add-Type两次,那么它将不会费心编译代码,只会返回上次的类型。

您可以通过在一行中运行两次Add-Type调用来验证这一点。

在上面的示例中出现错误消息的原因是,您在调用Add-Type之间更改了代码。虽然上面的解决方案在这种情况下消除了这个错误,但它也意味着您正在使用一个较旧的类型定义,该类型可能没有按照您所认为的方式运行。

票数 23
EN

Stack Overflow用户

发布于 2013-05-15 05:02:05

执行此操作的最简单方法是try/catch块。执行此操作有两种选择:

  • try { [MyClass] | Out-Null } catch { Add-Type -TypeDefinition $csharpString; }
  • try { Add-Type -TypeDefinition $csharpString; } catch {}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16552801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档