私のプログラムでは、列挙体を使用してオブジェクトの現在の状態を表しています。私は、この列挙体の値を1つずつ順番に調べることができるようにしたいと考えています。列挙型の値が数値的に連続し、0で始まるという事実は、与えられたものです。複数のアセンブリでの動的型のキャスト動作
列挙をインクリメントする関数を記述しようとしている最中にループすると問題が発生しました。
public static TEnum IncrWrap<TEnum>(TEnum value)
{
int len = Enum.GetNames(typeof(TEnum)).Length;
dynamic wrapper = value;
dynamic newValue = ((int)wrapper + 1) % len;
return (TEnum)newValue;
}
IncrWrap
方法は、それを呼び出すオブジェクトと同じアセンブリ(プロジェクト)に存在する場合、それが完璧に動作。しかし、RuntimeBinderException
をwrapper
に変換してint
にキャストしようとすると、別のプロジェクトに移動して(より多くのものがそれを利用できるように)、「タイプを変換できません」というメッセージが表示されます。 System.Enum 'を' int 'に変更します。
Whats up?異なるアセンブリから関数を呼び出すと、その関数が異なる動作をする理由がわかりません。 dynamic
私は理解できませんか?これを行うにはリフレクションを使用する必要はありません。
別の問題があります:Array.IndexOfは、 'value'の値がenumの定義された値の1つでない場合、-1を返します。 – phoog
素晴らしい!ありがとう。なぜ私のメソッドが2つの状況で異なった振る舞いをするのか不思議ですが、このソリューションは間違いなく優れています。 – Lucina