C# 使用反射从类填充字典

C# 使用反射从类填充字典,c#,dictionary,reflection,C#,Dictionary,Reflection,我想使用字典来替换HTML模板中两个$signs之间的单词。当我自己添加键的时候,我已经让它工作了,但是我希望能够使用反射进行替换,因此如果我将这个项目交给其他人,那么他们只需要更改类和模板键 我有一些属性的类。我填充这个类,然后尝试填充字典 public class FeedMessageValue { public string Username { get; set; } public string SubscriptionID { get; set; } publ

我想使用字典来替换HTML模板中两个$signs之间的单词。当我自己添加键的时候,我已经让它工作了,但是我希望能够使用反射进行替换,因此如果我将这个项目交给其他人,那么他们只需要更改类和模板键

我有一些属性的类。我填充这个类,然后尝试填充字典

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对此还是新手,您需要更多的代码还是我应该删除更多的代码?如果我们可以将其复制到控制台应用程序中并运行它,这是一个问题。我认为您的括号有问题。这非常有效。非常感谢你,这几天我一直在挠头尝试几种不同的方法