C# 使用反射从类填充字典
我想使用字典来替换HTML模板中两个$signs之间的单词。当我自己添加键的时候,我已经让它工作了,但是我希望能够使用反射进行替换,因此如果我将这个项目交给其他人,那么他们只需要更改类和模板键 我有一些属性的类。我填充这个类,然后尝试填充字典C# 使用反射从类填充字典,c#,dictionary,reflection,C#,Dictionary,Reflection,我想使用字典来替换HTML模板中两个$signs之间的单词。当我自己添加键的时候,我已经让它工作了,但是我希望能够使用反射进行替换,因此如果我将这个项目交给其他人,那么他们只需要更改类和模板键 我有一些属性的类。我填充这个类,然后尝试填充字典 public class FeedMessageValue { public string Username { get; set; } public string SubscriptionID { get; set; } publ
public class FeedMessageValue
{
public string Username { get; set; }
public string SubscriptionID { get; set; }
public DateTime MessageTime { get; set; }
}
public class FeedMessageData : IMailData
{
private FeedMessageValue feedMessageValue;
public FeedMessageData(string username, string subscriptionID, DateTime messageTime)
{
this.feedMessageValue = new FeedMessageValue
{
Username = username
, SubscriptionID = subscriptionID
, MessageTime = messageTime
};
PropertyInfo[] infos = this.feedMessageValue.GetType().GetProperties();
foreach (PropertyInfo info in infos)
{
this.getMergeValues().Add(info.Name, info.GetValue(this.feedMessageValue, null).ToString());
}
}
public Dictionary<string, string> getMergeValues()
{
return new Dictionary<string, string>();
}
}
公共类FeedMessageValue
{
公共字符串用户名{get;set;}
公共字符串SubscriptionID{get;set;}
public DateTime MessageTime{get;set;}
}
公共类FeedMessageData:IMailData
{
私有FeedMessageValue FeedMessageValue;
公共FeedMessageData(字符串用户名、字符串订阅ID、日期时间messageTime)
{
this.feedMessageValue=新的feedMessageValue
{
用户名=用户名
,SubscriptionID=SubscriptionID
,MessageTime=MessageTime
};
PropertyInfo[]infos=this.feedMessageValue.GetType().GetProperties();
foreach(信息中的PropertyInfo信息)
{
this.getMergeValues().Add(info.Name,info.GetValue(this.feedMessageValue,null).ToString());
}
}
公共字典getMergeValues()
{
返回新字典();
}
}
这将通过电子邮件生成器运行:
public interface IMailData
{
Dictionary<string, string> getMergeValues();
}
public interface IEmailGenerator
{
MailMessage generateEmail(IMailData mailData, string htmlTemplate, string textTemplate);
}
public class EmailGenerator : IEmailGenerator, IRegisterInIoC
{
// Setup the rules
static readonly Regex emailRegex = new Regex(@"\$([\w\-\,\.]+)\$", RegexOptions.Compiled);
private string mergeTemplate(string template, IReadOnlyDictionary<string, string> values)
{
string emailTextData = emailRegex.Replace(template, match => values[match.Groups[1].Value]);
return emailTextData;
}
public MailMessage generateEmail(IMailData mailData, string htmlTemplate, string textTemplate)
{
// MailMessage
}
}
公共接口IMailData
{
字典getMergeValues();
}
公共接口IEmailGenerator
{
MailMessage generateEmail(IMailData mailData、字符串htmlTemplate、字符串textmplate);
}
公共类EmailGenerator:IEmailGenerator,iRegisternioc
{
//设置规则
静态只读正则表达式emailRegex=newregex(@“\$([\w\-\,\.]+)\$”,RegexOptions.Compiled);
私有字符串合并模板(字符串模板,IREADONLYDICTIONAL值)
{
字符串emailTextData=emailRegex.Replace(模板,match=>values[match.Groups[1].Value]);
返回emailTextData;
}
public MailMessage generateEmail(IMailData mailData、string htmlTemplate、string textmplate)
{
//邮件
}
}
因此,理论上,字典中的一个键值对现在应该是{“Username”,Username},但是使用我的代码替换$Username$,然后它抛出一个错误,即Username没有键值。问题在于
getMergeValues()
。您每次都在创建一个新的dictionary
实例。将该方法更改为属性,或让其返回字段
现在,当您在PropertyInfo[]
中循环时,您将创建字典
的一个新实例,添加{“Username”,Username}
,然后不要对您创建的字典
进行任何引用。然后,在循环的下一次迭代中,您创建了第二个字典
,这个字典可能带有{SubscriptionId,SubscriptionId}
,并且不使用该引用执行任何操作。等等等等
公共类FeedMessageData:IMailData
{
私有FeedMessageValue FeedMessageValue;
公共FeedMessageData(字符串用户名、字符串订阅ID、日期时间messageTime)
{
MergeData=newdictionary();
this.feedMessageValue=新的feedMessageValue
{
用户名=用户名
,SubscriptionID=SubscriptionID
,MessageTime=MessageTime
};
PropertyInfo[]infos=this.feedMessageValue.GetType().GetProperties();
foreach(信息中的PropertyInfo信息)
{
MergeData.Add(info.Name,info.GetValue(this.feedMessageValue,null).ToString());
}
}
公共字典合并数据{get;}
}
@mjwills对此还是新手,您需要更多的代码还是我应该删除更多的代码?如果我们可以将其复制到控制台应用程序中并运行它,这是一个问题。我认为您的括号有问题。这非常有效。非常感谢你,这几天我一直在挠头尝试几种不同的方法