2016-02-07 18 views
0

我正在写一个PowerShell脚本,如果它尚未加载,则会加载程序集。我给这家在C#中的逻辑是以下几点:如何使用C#编写try-get函数?

void DoSomething(string assemblyFilePath) 
{ 
    string name = Path.GetFileNameWithoutExtension(assemblyFilePath); 

    Assembly assemblyObject; 
    if (!TryGetAssembly(name, out assemblyObject)) 
    { 
     assemblyObject = LoadAssemblyFrom(assemblyFilePath); 
    } 

    // Do something with assemblyObject. 
} 

我试着翻译成PowerShell中,但它不工作了这么远。这里是我的进步:

function TryGet-Assembly($assembly, [ref] $cached) 
{ 
    $domain = [AppDomain]::CurrentDomain 

    foreach ($reference in $domain.GetAssemblies()) 
    { 
     # GetName() has a type of AssemblyName, 
     # so we need to use GetName().Name to get a string 
     $name = $reference.GetName().Name 
     if ($name -eq $assembly) 
     { 
      $cached = $reference 
      return $true 
     } 
    } 

    return $false 
} 

function Get-Namespaces($assembly) 
{ 
    # Load the assembly, or retrieve it if it's cached 
    $name = [IO.Path]::GetFileNameWithoutExtension($assembly) 
    if (-not TryGet-Assembly $name $assemblyObject) 
    { 
     $assemblyObject = Load-Assembly $assembly 
    } 

    # Do the actual work 
    $types = $assemblyObject.GetTypes() 
    return $types | ? IsPublic | select Namespace -Unique 
} 

出于某种原因,我似乎在PowerShell尝试运行脚本时出现语法错误。这里是输出:

At C:\Users\James\Code\csharp\Shims.Xaml\generate.ps1:83 char:13 
+  if (-not TryGet-Assembly $name $assemblyObject) 
+    ~ 
Missing expression after unary operator '-not'. 
At C:\Users\James\Code\csharp\Shims.Xaml\generate.ps1:83 char:14 
+  if (-not TryGet-Assembly $name $assemblyObject) 
+    ~~~~~~~~~~~~~~~ 
Unexpected token 'TryGet-Assembly' in expression or statement. 
At C:\Users\James\Code\csharp\Shims.Xaml\generate.ps1:83 char:14 
+  if (-not TryGet-Assembly $name $assemblyObject) 
+    ~~~~~~~~~~~~~~~ 
Missing closing ')' after expression in 'if' statement. 
At C:\Users\James\Code\csharp\Shims.Xaml\generate.ps1:80 char:1 
+ { 
+ ~ 
Missing closing '}' in statement block or type definition. 
At C:\Users\James\Code\csharp\Shims.Xaml\generate.ps1:83 char:51 
+  if (-not TryGet-Assembly $name $assemblyObject) 
+             ~ 
Unexpected token ')' in expression or statement. 
At C:\Users\James\Code\csharp\Shims.Xaml\generate.ps1:91 char:1 
+ } 
+ ~ 
Unexpected token '}' in expression or statement. 
    + CategoryInfo   : ParserError: (:) [], ParseException 
    + FullyQualifiedErrorId : MissingExpressionAfterOperator

为什么会发生这种情况,我该如何解决这个问题?

+0

你为什么不向我们展示你在C#中编写的'TryGetAssembly'? – poke

+0

这就是说,对于你的语法错误,你需要在'-not'的操作数周围加上括号。 – poke

+0

@poke太棒了,谢谢!这解决了它。 –

回答

1

由于函数调用通常在PowerShell中没有括号,这具有不幸的效果,即运算符优先级不像其他语言那样有用。

尤其是-not(或!)运营商通常要求你包的操作完全括号内:

if (-not (TryGet-Assembly $name $assemblyObject)) 

或用备用别名!-not

if (!(TryGet-Assembly $name $assemblyObject)) 

我个人比较喜欢但明确的-not,因为它是更加可见的那些括号之间。