1

我有我POST用来触发发送电子邮件的方法

[HttpPost]
public HttpResponseMessage Post(IEmail model)
{
    SendAnEmailPlease(model);
}

我有很多类型的电子邮件要发送,所以我抽象到一个界面,所以我只需要一个 post 方法

 config.BindParameter(typeof(IEmail), new EmailModelBinder());

我有我的模型活页夹,它被击中了

public class EmailModelBinder : IModelBinder
{
    public bool BindModel(
        HttpActionContext actionContext, 
        ModelBindingContext bindingContext )
    {
        // Logic here           

        return false;
    }
}

我正在为将其bindingContext.PropertyMetadata变成我的电子邮件 POCO 之一的逻辑而苦苦挣扎

public IDictionary<string, ModelMetadata> PropertyMetadata { get; }     

在 PropertyMetadata 中,我将对象类型作为字符串传递,我认为可以使用该字符串来创建具有该Activator.CreateInstance方法的类。

eg: EmailType = MyProject.Models.Email.AccountVerificationEmail

有没有简单的方法来实现这一点?


相关问题

4

1 回答 1

1

这是我想出的解决方案,可能对其他人有用。

public class EmailModelBinder : IModelBinder
{
    public bool BindModel(
        HttpActionContext actionContext, 
        ModelBindingContext bindingContext)
    {
        string body = actionContext.Request.Content
                       .ReadAsStringAsync().Result;

        Dictionary<string, string> values = 
            JsonConvert.DeserializeObject<Dictionary<string, string>>(body);

        var entity = Activator.CreateInstance(
            typeof(IEmail).Assembly.FullName, 
            values.FirstOrDefault(x => x.Key == "ObjectType").Value
            ).Unwrap();

        JsonConvert.PopulateObject(body, entity);

        bindingContext.Model = (IEmail)entity;

        return true;
    }
}
于 2013-05-17T16:02:33.497 回答