在RazorEngine中使用内部属性

时间:2017-02-16 04:30:10

标签: c# access-modifiers razorengine

我们的域模型属性都是“内部”,以保护我们采用的BDD方法。我真的很喜欢把一切都内部化。

最近,我试图让RazorEngine使用其中一个具有内部成员的域模型来处理模板。编译时,我收到错误:.Attendee.FirstName' is inaccessible due to its protection level

我尝试将此行[assembly: InternalsVisibleTo("RazorEngine")]添加到我的域模型的AssemblyInfo.cs中,但它似乎没有帮助。

如何在同一个项目中对RazorEngine显示我的内部属性。

代码

public class Attendee : AggregateRoot {
    protected internal virtual new long Id { get; protected set; }
    protected internal virtual Event Event { get; protected set; }
    protected internal virtual bool? Online { get; protected set; }
    protected internal virtual string FirstName { get; protected set; }
    protected internal virtual string LastName { get; protected set; }
    protected internal virtual string Email { get; protected set; }
    protected internal virtual string Affiliation { get; protected set; }
    protected internal virtual string MeetingPassword { get; protected set; }
    protected internal virtual decimal AmountPaid { get; protected set; }
    protected internal virtual DateTime DateRegistered { get; protected set; } 

    public virtual void SendEmail() {

                var assembly = Assembly.GetExecutingAssembly();
                var stream = assembly.GetManifestResourceStream("VirtualAcademy.Domain.Email.RegistrationConfirmation.cshtml");
                var reader = new StreamReader(stream);
                var template = reader.ReadToEnd();                 
                Engine.Razor.RunCompile(template, "key", null, this);
     }

CSHTML文件

@model VirtualAcademy.Domain.Attendee

<html>
<body style="font: 12px arial, sans-serif">
    <div>
        <span id="SalutationLabel">Hello @Model.FirstName @Model.LastName,</span>

3 个答案:

答案 0 :(得分:3)

很遗憾你不能这样做......

@Model只是WebViewPage的公共属性&lt; TModel&gt;所以InternalsVisibleTo没什么区别

我建议你为你的视图创建一个ViewModel (也许使用T4模板,您可以为内部模型生成类)

现在,如果您愿意失去类型安全性,可以编写扩展方法并使用反射

访问该值

答案 1 :(得分:0)

InternalsVisibleTo属性需要程序集的名称而不是类名称或名称空间。所以你需要把它改成以下。

[InternalsVisibleTo("System.Web.Mvc")]

答案 2 :(得分:0)

请阅读Microsoft强命名 StrongNameIdentityPermission

可能存在问题