2016-10-27 2 views
1

Попытка создать функцию, как следующее:Powershell Функция Ограничение типа данных

Function Get-SqlErrorLogPrevious24 { 
    [CmdletBinding()] 
    Param (
     [Parameter(Mandatory=$True,Position=1)] 
     [Microsoft.SqlServer.Management.Smo.Server]$Server 
    ) 

    ($Server.ReadErrorLog()).where{$_.logdate -ge ((Get-Date).AddHours(-24))} 
} 

Что я заметил, однако, является то, что я могу передать только строку, а не объект сервера.

Есть ли способ в Powershell для сильного применения передаваемого типа данных или он всегда будет неявно преобразовывать строку в объект SMO?

ответ

3

№ PowerShell имеет несколько «стратегий», которые он использует, чтобы убедиться, что то, что вы получаете в функции, является правильным типом. Если он может использовать один из них для преобразования переданного значения (в данном случае строки) в требуемый тип (объект SMO), он это сделает.

Вот great post which lists 10 different strategies.

  1. Прямое назначение. Если ваш вход назначается напрямую, просто введите свой ввод в этот тип.
  2. Языковое преобразование. Эти преобразования на основе языка выполняются, когда целевой тип недействителен, Boolean, String, Array, Hashtable, PSReference (т. Е. [Ref]), XmlDocument (т. Е .: [xml]). Делегат (поддержка ScriptBlock для делегирования конверсий) и Enum.
  3. Анализ анализа. Если целевой тип определяет метод Parse(), который принимает этот ввод, используйте его.
  4. Статическое создание преобразования. Если целевой тип определяет метод static :: Create(), который принимает этот ввод, используйте это.
  5. Конструктор преобразования. Если целевой тип определяет конструктор, который принимает ваши данные, используйте это.
  6. Кастинг. Если целевой тип определяет неявный или явный оператор литья из типа источника, используйте его. Если тип источника определяет неявный или явный оператор приведения к целевому типу, используйте его.
  7. IC-обратимый изменение. Если тип источника определяет реализацию IConvertible, которая знает, как преобразовать в целевой тип, используйте это.
  8. IDictionary conversion. Если тип источника является IDictionary (например, Hashtable), попробуйте создать экземпляр типа назначения с использованием его конструктора по умолчанию, а затем используйте имена и значения в IDictionary для установки свойств исходного объекта.
  9. PSObject свойство conversion. Если тип источника представляет собой объект PSObject, попробуйте создать экземпляр типа назначения с использованием его конструктора по умолчанию, а затем использовать имена свойств и значения в объекте PSObject для установки свойств исходного объекта. , Если имя сопоставляется методу вместо свойства, вызовите этот метод со значением в качестве аргумента.
  10. Тип Преобразование конвертера. Если есть зарегистрированный TypeConverter или PSTypeConverter, который может обрабатывать преобразование, сделайте это. Вы можете зарегистрировать TypeConverter через файл types.ps1xml (см .: $ pshome \ Types.ps1xml) или через Update-TypeData.
4

Вы можете реализовать атрибут пользовательского преобразования, который будет бросать исключение, если тип отличается:

Add-Type @' 
    using System; 
    using System.Management.Automation; 
    public class EnforceTypeAttribute : ArgumentTransformationAttribute { 
     private Type type; 
     public EnforceTypeAttribute(Type type) { 
      this.type=type; 
     } 
     public override object Transform(EngineIntrinsics engineIntrinsics, object inputData) { 
      if(type.IsInstanceOfType(inputData)) { 
       return inputData; 
      } else { 
       throw new Exception("Incorrect type."); 
      } 
     } 
    } 
'@ 

function f {param([int]$i) $i} 
function g {param([EnforceType([int])][int]$i) $i} 

f 1 #OK 
f '1' #OK 
g 1 #OK 
g '1' #Error 
Смежные вопросы