【问题标题】:Using Internal Properties in RazorEngine在 RazorEngine 中使用内部属性
【发布时间】:2017-07-05 00:51:07
【问题描述】:

我们的域模型属性都是“内部的”,以保护我们采用的 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>

【问题讨论】:

  • 我真的不明白为什么这是一个问题 - 如果它是一个旨在供第三方库使用的模型,它应该是公开的。

标签: c# access-modifiers razorengine


【解决方案1】:

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

@Model 只是 WebViewPage 的公共属性,所以 InternalsVisibleTo 没有区别

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

现在,如果您愿意失去类型安全,您可以编写一个扩展方法并使用反射访问该值

【讨论】:

    【解决方案2】:

    InternalsVisibleTo 属性需要程序集的名称,而不是类名或命名空间。因此,您需要将其更改为以下。

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

    【讨论】:

    • RazorEngine 是程序集的名称。我对 InternalsVisibleTo 非常熟悉。我认为 RazorEngine 有一些非常具体的地方。
    【解决方案3】:

    阅读Microsoftstrong NamingStrongNameIdentityPermission

    可能存在问题

    【讨论】:

      猜你喜欢
      • 2019-03-06
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多