Замена токена с помощью отражения - PullRequest
3 голосов
/ 07 февраля 2012

У меня есть приложение, которое в значительной степени основано на пользовательских классах, и я пытаюсь выполнить пользовательскую замену в зависимости от типа данного токена замены.

Что бы якак и в случае (глядя на приведенный ниже код) задается определенная строка, проходящая через объект _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 ]

2 голосов
/ 07 февраля 2012

Да, вы можете использовать отражение. Просто используйте PropertyInfo type для 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;
}

Если вам не нужно, чтобы это основывалось на рефлексии, вы также можете пойти по пути Матти Вирккунена, который позволяет задавать некоторые более сложные запросы к объектам, чем простое чтение свойства.

2 голосов
/ 07 февраля 2012

Я думаю, что самый простой способ изменить этот фрагмент кода, чтобы сделать то, что вы хотите, состоит в том, чтобы модифицировать токены, чтобы они содержали функции вместо ... объектов или того, чем в данный момент является 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 и вместо этого создать словарь значений, а затем заменить все, что похоже на тег, значениями из словаря. Вещи, похожие на теги, можно легко найти с помощью регулярного выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...