使用反射替换令牌

本文关键字:令牌 替换 反射 | 更新日期: 2023-09-27 18:22:39

我有一个应用程序,它在很大程度上基于自定义类,并且在尝试根据给定替换令牌的类型进行自定义替换时遇到了困难。

我想做的(查看下面的代码)是给定一个特定的字符串,循环通过_tokens对象。对于找到的每个令牌,识别TokenReplacement中提供的对象类型,并将其替换为由User对象提供的同一对象的值。

任何帮助或其他方法都将不胜感激。

编辑:忘了提一下这会导致堆栈溢出错误。

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

使用反射替换令牌

是的,您可以使用反射。只需将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的方法,它允许在对象上指定一些比简单的属性读取更复杂的查询。

我认为修改这段代码以执行您想要的操作的最简单方法是将标记修改为包含函数,而不是。。。对象或当前的任何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列表,而是构建一个值的字典,然后用字典中的值替换所有看起来像标签的内容。使用正则表达式可以很容易地找到看起来像标签的东西。