2012-02-06 5 views
3

私は、カスタムクラスにかなり基づいているアプリケーションを持っています。そして、置き換えトークンがあるタイプに基づいてカスタム置換を試みる際に壁を打っています。リフレクションを使用したトークン置換

私は何をしたいですか(下のコードを見てください)には、特定の文字列が与えられ、_tokensオブジェクトをループします。見つかった各トークンについて、TokenReplacementで提供されているオブジェクトのタイプを特定し、ユーザオブジェクトによって提供される同じオブジェクトの値に置き換えます。

これに対する助力やその他のアプローチは非常に高く評価されます。

編集:これは、私にスタックオーバーフローエラーが発生することを忘れています。

private BasicUser BU = new BasicUser(); 
private readonly List<Token> _tokens = new List<Token> 
{ 
    new Token 
    { 
    TokenName = "Lan ID", 
    TokenIdentifier = "<!--LANID-->", 
    TokenReplacement = this.BU.LanID 
    }, 
    new Token 
    { 
    TokenName = "First Name", 
    TokenIdentifier = "<!--FirstName-->", 
    TokenReplacement = new BasicUser().FirstName 
    }, 
    new Token 
    { 
    TokenName = "Last Name", 
    TokenIdentifier = "<!--LastName-->", 
    TokenReplacement = new BasicUser().LastName 
    } 
}; 

public string ReplaceTokens(string Input, string LanID) 
{ 
    string OutputString = ""; 
    BasicUser User = GetParticipantInformation(Input); 
    foreach (var token in _tokens) 
    { 
    token.TokenReplacement.GetType(); 
    OutputString = OutputString.Replace(token.TokenName, "Token replacement"); 
    } 
    return OutputString; 
} 
+0

何が溢れているか知っていますか?スタックオーバーフローを暗示するような再帰呼び出しや何も表示されません。 – deepee1

+1

重要なものを省略したようです。 'token.TokenReplacement.GetType()'行にはポイントがありません。 'OutputString'は常に空です... –

+2

できるだけ小さな_working_問題の例を提供する必要があります。 –

答えて

2

はい、反射を使用できます。ただ、TokenReplacementためPropertyInfoタイプを使用して、それを次のように必要なプロパティを割り当てる:

class Token { 
    string TokenName; 
    string TokenIdentifier; 
    PropertyInfo TokenReplacement; 
} 

private readonly List<Token> _tokens = new List<Token> 
{ 
    new Token 
    { 
    TokenName = "Lan ID", 
    TokenIdentifier = "<!--LANID-->", 
    TokenReplacement = typeof(BasicUser).GetProperty("LanID") 
    }, 
    new Token 
    { 
    TokenName = "First Name", 
    TokenIdentifier = "<!--FirstName-->", 
    TokenReplacement = typeof(BasicUser).GetProperty("FirstName") 
    } 
}; 

public string ReplaceTokens(string Input, string LanID) 
{ 
    string OutputString = ""; 
    BasicUser User = GetParticipantInformation(Input); 
    foreach (var token in _tokens) 
    { 
    OutputString = OutputString.Replace(token.TokenName, token.TokenReplacement.GetValue(User, null).ToString()); 
    } 
    return OutputString; 
} 

あなたは反射に基づくもので、このする必要がない場合、あなたはまた、指定することができますマッティVirkkunenの道を行くことができます単純なプロパティの読み込みよりもオブジェクトに対するより複雑なクエリ。

+0

ありがとう!これはまさに私が必要としていたものです。 –

2

私はあなたがやりたいようにコードのこの部分を変更する最も簡単な方法は、関数の代わりに...オブジェクトまたは何TokenReplacementが現在であるが含まれているために、トークンを変更することだと思います。

class Token { 
    Func<BasicUser, object> TokenReplacement; 
    // ... 
} 

// ... 

    new Token 
    { 
    TokenName = "Lan ID", 
    TokenIdentifier = "<!--LANID-->", 
    TokenReplacement = user => user.LanID, 
    }, 
    new Token 
    { 
    TokenName = "First Name", 
    TokenIdentifier = "<!--FirstName-->", 
    TokenReplacement = user => user.FirstName, 
    }, 

// ... 

OutputString = OutputString.Replace(token.TokenName, 
    token.TokenReplacement(User).ToString()); 

別のアプローチは、完全に_tokensリストを失い、代わりに値の辞書を構築して、辞書からの値を持つタグのように見えるすべてのものに置き換えることであろう。タグのように見えるものは、正規表現で簡単に見つけることができます。

+0

良い解決策。私は彼が実際にtoken.TokenIdentifierをReplaceの最初のパラメータとして望んでいると仮定しますが、彼の例ではあいまいさがたくさんあります。 – deepee1

+0

@ deepee1:おそらく。私はちょうどそれをコピー貼りました。 –

+1

素晴らしいソリューションですが、OPは反射ベースのソリューションを求めていました。しかし、それが要件でなければ、私はこのものが好きで、同じものに行くだろう。 – Krizz

関連する問題