2 つの型がsourceType
ありtargetType
、C# でメソッドを記述する必要があります。このメソッドは、 の値をsourceType
の変数に代入できるかどうかを確認しますtargetType
。関数のシグネチャはMatchResultTypeAndExpectedType(Type sourceType, Type targetType)
.
継承はIsAssignableFromによってカバーされます。変換可能な型の場合、 CanConvertFromを使用することを考えましたが、たとえば両方の型が数値の場合、常に を返しますfalse
。私が行ったテスト:
TypeConverter typeConverter = TypeDescriptor.GetConverter(typeof(Decimal));
Console.WriteLine("Int16 to Decimal - " + typeConverter.CanConvertFrom(typeof(Int16)));
Console.WriteLine("UInt16 to Decimal - " + typeConverter.CanConvertFrom(typeof(UInt16)));
typeConverter = TypeDescriptor.GetConverter(typeof(long));
Console.WriteLine("UInt16 to Int64 - " + typeConverter.CanConvertFrom(typeof(uint)));
typeConverter = TypeDescriptor.GetConverter(typeof(Double));
Console.WriteLine("UInt16 to Double - " + typeConverter.CanConvertFrom(typeof(UInt16)));
typeConverter = TypeDescriptor.GetConverter(typeof(String));
Console.WriteLine("UInt16 to String - " + typeConverter.CanConvertFrom(typeof(UInt16)));
結果は次のとおりです。
Int16 to Decimal - False
UInt16 to Decimal - False
UInt16 to Int64 - False
UInt16 to Double - False
UInt16 to String - False
[編集]だから私の質問: .NET で、値を知らなくても、特定の型の値を別の型の変数に割り当てることができるかどうか、たとえば、暗黙的な変換が成功するかどうかを確認する方法はありますか? の実装に関するより具体的な要件MatchResultTypeAndExpectedType(Type sourceType, Type targetType)
:
- アセンブリは後で読み込まれるため、ソースとターゲットの型はコンパイル時にはわかりません。
- 値またはオブジェクトを入力として提供することはできません。
- システムの残りの部分では許可されていないため、このタイプのオブジェクトを実装で作成することはできません。値型の値を作成できます。
- 暗黙的な変換のみをチェックする必要があります。
sourceType
値型かどうかはわかっています。したがって、メソッドのシグネチャは次のようになりますMatchResultTypeAndExpectedType(Type sourceType, Boolean isSourceValueType, Type targetType)
1 つの方法はImplicit Numeric Conversions Tableを実装することですが、他の変換やユーザー定義の変換には対応していません。