使用反射替换令牌

时间:2012-02-06 20:39:14

标签: c# reflection token replace

我的应用程序相当基于自定义类,并且在尝试根据给定替换令牌的类型进行自定义替换时遇到了障碍。

我想要做的(查看下面的代码)给出了一个字符串,循环遍历 _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;
}

2 个答案:

答案 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列表,而是构建值的字典,然后用字典中的值替换看起来像标记的所有内容。看起来像标签的东西很容易用正则表达式找到。

答案 1 :(得分:2)

是的,你可以使用反射。只需为PropertyInfo使用TokenReplacement类型,并为其指定您需要的属性,如下所示:

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;
}

如果您不需要基于反射,那么您也可以使用Matti Virkkunen的方式,它允许在对象上指定比简单属性读取更复杂的查询。