PowerShell で 型を呼び出す場合は、次のようにします。
[string]
では、この string などの部分を変数に置き換えれないのでしょうか。例えばこうです。
$type = "string" [$type]
しかしこれはできません。
ではどうやるのかを見てみましょう。
目次
目標
静的メソッドを呼び出すことをゴールとします。
[System.Type]::GetType(T) を利用する
簡単です。[System.Type]::GetType(T)
を利用すればいいのです。
但し、指定するのは AssemblyQualifiedName である必要があります。
# stringではだめ $typeName = "string" [System.Type]::GetType($typeName)::IsNullOrEmpty($null)
[string] を見てみましょう。
[string] | select *
Module : CommonLanguageRuntimeLibrary Assembly : mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 TypeHandle : System.RuntimeTypeHandle DeclaringMethod : BaseType : System.Object UnderlyingSystemType : System.String FullName : System.String AssemblyQualifiedName : System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Namespace : System GUID : 296afbff-1b0b-3ff5-9d6c-4e7e599f8b57 IsEnum : False GenericParameterAttributes : IsSecurityCritical : False IsSecuritySafeCritical : False IsSecurityTransparent : True IsGenericTypeDefinition : False IsGenericParameter : False GenericParameterPosition : IsGenericType : False IsConstructedGenericType : False ContainsGenericParameters : False StructLayoutAttribute : System.Runtime.InteropServices.StructLayoutAttribute Name : String MemberType : TypeInfo DeclaringType : ReflectedType : MetadataToken : 33554509 GenericTypeParameters : {} DeclaredConstructors : {Void .ctor(Char*), Void .ctor(Char*, Int32, Int32), Void .ctor(SByte*), Void .ctor(SByte*, Int32, Int32)...} DeclaredEvents : {} DeclaredFields : {m_stringLength, m_firstChar, Empty, TrimHead...} DeclaredMembers : {Int32 Compare(System.String, System.String), Int32 Compare(System.String, System.String, Boolean), Int32 Compare(System.String, System.String, System.StringComparison), Int32 Compare(System .String, System.String, System.Globalization.CultureInfo, System.Globalization.CompareOptions)...} DeclaredMethods : {Int32 Compare(System.String, System.String), Int32 Compare(System.String, System.String, Boolean), Int32 Compare(System.String, System.String, System.StringComparison), Int32 Compare(System .String, System.String, System.Globalization.CultureInfo, System.Globalization.CompareOptions)...} DeclaredNestedTypes : {} DeclaredProperties : {Int32 Length, Char FirstChar, Char Chars [Int32], Boolean LegacyMode} ImplementedInterfaces : {System.IComparable, System.ICloneable, System.IConvertible, System.IComparable`1[System.String]...} TypeInitializer : IsNested : False Attributes : AutoLayout, AnsiClass, Class, Public, Sealed, Serializable, BeforeFieldInit IsVisible : True IsNotPublic : False IsPublic : True IsNestedPublic : False IsNestedPrivate : False IsNestedFamily : False IsNestedAssembly : False IsNestedFamANDAssem : False IsNestedFamORAssem : False IsAutoLayout : True IsLayoutSequential : False IsExplicitLayout : False IsClass : True IsInterface : False IsValueType : False IsAbstract : False IsSealed : True IsSpecialName : False IsImport : False IsSerializable : True IsAnsiClass : True IsUnicodeClass : False IsAutoClass : False IsArray : False IsByRef : False IsPointer : False IsPrimitive : False IsCOMObject : False HasElementType : False IsContextful : False IsMarshalByRef : False GenericTypeArguments : {} CustomAttributes : {[System.SerializableAttribute()], [System.Runtime.InteropServices.ComVisibleAttribute((Boolean)True)], [System.Reflection.DefaultMemberAttribute("Chars")], [__DynamicallyInvokableAttribute( )]}
String の場合、 このような指定であれば評価されます。
$typeName = [string].AssemblyQualifiedName [System.Type]::GetType($typeName)::IsNullOrEmpty($null)
あるいは FullNameでも。
$typeName = [string].FullName [System.Type]::GetType($typeName)::IsNullOrEmpty($null)
サンプル
前記事の、PowerShell で Windows の 資格情報マネージャー を利用する (Jenkins などでの Git Credentialなど) で紹介したモジュールで利用したりしています。
まとめ
やりたくなりますよねー。はい。