@Toxantronが示唆された各クラスのサブクラスに対応する文字列のプロパティを定義するいくつかの抽象クラスを持っています。リフレクションを使用して適切なクラス/タイプを見つけ出し、インスタンス化します。それはこのようになります:
public abstract class BaseClass
{
public abstract string InputString { get; }
}
public class ChildClass1 : BaseClass
{
public override string InputString { get { return "a"; } }
}
public class ChildClass2 : BaseClass
{
public override string InputString { get { return "b"; } }
}
は、その後、あなたがこのような方法で何かに正しいクラスをインスタンス化できます。あなたはまた、作成したインスタンスのリストをキャッシュすること
public BaseClass GetClassFromString(string inputString)
{
return typeof(BaseClass).Assembly.GetTypes()
.Where(x => typeof(BaseClass).IsAssignableFrom(x))
.Select(x => Activator.CreateInstance(x))
.FirstOrDefault(x => x.InputString == inputString);
}
最初の後、そのので、これはより効率的に実行されます。
編集:ここで私が述べたキャッシングの例です:
private static Dictionary<string, Type> _stringTypeDictionary;
public BaseClass GetClassFromString(string inputString)
{
// If cache doesn't already exist, create it
if (_stringTypeDictionary == null)
{
_stringTypeDictionary = typeof(BaseClass).Assembly.GetTypes()
.Where(x => typeof(BaseClass).IsAssignableFrom(x))
.Select(x => Activator.CreateInstance(x))
.ToDictionary(x => x.InputString, x => x.GetType());
}
if (_stringTypeDictionary.ContainsKey(inputString))
return Activator.CreatInstance(_stringTypeDictionary[inputString]) as BaseClass;
else
return null; // May want to throw exception here...that's up to you
}
1500文字列ごとに別々のクラスを初期化していますか、または大量に特定のクラスを初期化していますか? – oppassum
ここで性能と問題はありますか?それはどのくらい頻繁に呼び出されますか?ここでは、別のオプションが表示されています: 1.クラスにアクセスできる場合は属性を適用し、リフレクションを使用して適切なものを探します。 2.スタティック登録ポイント を使用してください。3.カスタムコードジェネレータ – Toxantron