そう、
明確にするために、私はすでにこのQ&Aを見ましたが、これは私の質問ではありません。
さて、私の質問は、Excelから抽出して、分割やその他の方法で分解し、列挙型であるかどうかを確認できる文字列があるということです。
例えば:
string enumStr = "eSomeEnumObject RANDOMENUMVAL"
は文字列であり、分割して列挙型であるかどうかを確認し、文字列配列を次のように取得できます。
string[] enumArr = { "SomeEnumObject", "RANDOMENUMVAL" };
ここで、class TestClass
さまざまなメソッド定義と列挙型も含むライブラリを参照するで使用する必要があります。抽出した列挙型オブジェクトの名前と値は、基本的にすでにそこに存在します。これで、文字列を列挙値に変換するには、次のようなものを使用することがわかりました。
SomeEnumObject enumobj = (SomeEnumObject)Enum.Parse(typeof(SomeEnumObject, "RANDOMENUMVAL");
今私の質問は:
私がプロセスを自動化しようとしているので、文字列として持っているこの列挙型オブジェクト名を取得し、列挙型オブジェクトタイプとして動的に書き込むにはどうすればよいですか?
enumArr[0] enumobj = (enumArr[0])Enum.Parse(typeof(enumArr[0], enumArr[1]);
文字列を列挙型として解析できないため、エラーがスローされます。
だから今、列挙型を再定義せずにこれを行う方法はありますか?
ありがとう!
Type.GetType()
またはを使用Assembly.GetType()
して型を取得する必要があります。
あなたは知る必要があるでしょう:
列挙型が呼び出し元のコードと同じアセンブリにある場合は、を使用できますType.GetType(fullyQualifiedName)
。別のアセンブリにある場合は、アセンブリ修飾名を作成するか、アセンブリを見つけて(コンパイル時に知っている別のタイプを使用するなど)GetType
、アセンブリを呼び出す必要があります。
列挙型の値を解析すると、コンパイル時の型はになりますobject
が、実際には列挙型の(ボックス化された)値になります。その時点で、次のことができます。
object
他に何も必要ないかのように保管してくださいdynamic
キーワードで動的に使用するToString()
(同じ値に複数の名前がある場合など、最初に使用したのと同じ文字列が得られない場合があります)コンパイラはコンパイル時に型を知る必要があるため、変数の実行時の値を型として使用して変数を宣言することはできません。しかし、上記のオプションの1つが役立つはずです。
完全な例を次に示します。
using System;
namespace TestApp
{
public enum Foo
{
Bar = 123
}
public class Program
{
static void Main()
{
// You've parsed these out already
string name = "Foo";
string value = "Bar";
// Work out the fully-qualified name and fetch
// the type. We use the namespace of a type that
// we know is in the same namespace as the enum we're
// looking for.
string ns = typeof(Program).Namespace;
string fqn = $"{ns}.{name}";
Type type = Type.GetType(fqn);
if (type == null)
{
throw new Exception($"Unknown type: {fqn}");
}
// Parse the value
object enumValue = Enum.Parse(type, value);
Console.WriteLine((int) enumValue); // 123
}
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加