6

マイクロソフトのドキュメントから、Type.GetType.NET 4.5 では大文字と小文字を区別しない場合があります。残念ながら、これは WinRT (メトロ/モダン UI/ストア アプリ) では利用できません。

既知の回避策はありますか? すべての文字列表現が大文字のプロトコルからオブジェクトをインスタンス化する必要があるためです。

例: "MYOBJECT" から、インスタンス化する必要がありますMyObject

現在 を使用Activator.CreateInstance(Type.GetType("MYOBJECT"))していますが、大文字と小文字が区別されるため、動作しません。

ありがとう

4

3 に答える 3

7

タイプをロードしているアセンブリを知っていますか? その場合は、一度呼び出すだけで、大文字と小文字を区別しないDictionary<string, Type>( を使用して) を作成できます。その後、まったく使用する必要はありません- 辞書を参照してください:StringComparer.OrdinalIgnoreCaseAssembly.GetTypes()Type.GetType()

// You'd probably do this once and cache it, of course...
var typeMap = someAssembly.GetTypes()
                          .ToDictionary(t => t.FullName, t => t,
                                        StringComparer.OrdinalIgnoreCase);

...

Type type;
if (typeMap.TryGetValue(name, out type))
{
    ...
}
else
{
    // Type not found
}

編集:これらはすべて同じ名前空間にあることがわかったので、簡単にフィルタリングできます:

var typeMap = someAssembly.GetTypes()
                          .Where(t => t.Namespace == "Foo.Bar")
                          .ToDictionary(t => t.Name, t => t,
                                        StringComparer.OrdinalIgnoreCase);
于 2012-10-26T14:33:21.450 に答える
4

メソッドを使用GetTypes()して、タイプが含まれるアセンブリ内のすべての可能なタイプをフェッチし、その後、どのタイプの大文字がタイプの大文字に等しいかを確認してから、それをGetTypeメソッドで使用できます。

于 2012-10-26T14:33:52.210 に答える
1

Car実際のクラス名はであり、クエリ文字列は であると考えてくださいCAR。これらは大文字と小文字の区別が異なるため、Type.GetType() は null を返します。Carこれを解決するには、まず (名前空間が であると仮定します) の名前空間からすべてのクラスをフィルター処理しますVehicle

var varClasses = from t in Assembly.GetExecutingAssembly().GetTypes()
                 where t.IsClass && t.Namespace == "Vehicles"
                 select t;

に変換するList

List<Type> lstClasses = varClasses.ToList();

変数を宣言してクラスの実際の名前を取得し、ループを使用して大文字と小文字を区別せずに文字列を比較します。

string strActualName = "";
foreach (Type t in lstClasses )
{
     if (t.Name.ToLower() == "CAR".ToLower())
     {
           strActualName = t.Name;
           break;
     }
}

新しい文字列で、 Type.GetType() を使用します

Type t1 = Type.GetType("Vehicles." + strActualName);
于 2014-11-03T08:48:46.123 に答える