gpt4 book ai didi

c# - 模板中的 RazorEngine 扩展方法

转载 作者:太空宇宙 更新时间:2023-11-03 21:57:41 26 4
gpt4 key购买 nike

我正在使用 Razor 引擎:https://github.com/Antaris/RazorEngine .

我正在动态创建模型。我试图在模板中包含一个扩展方法,但它会识别扩展类。我收到以下错误消息“‘string’不包含‘ToUpperFirstLetter’的定义

模型创建

dynamic model = new ExpandoObject();
((IDictionary<string, object>)model).Add("Forename", "john");

模板

@using Namespace.Extensions
@{
ViewBag.Title = "Title";
}

Hello @Model.Forename.ToUpperFirstLetter()

扩展类

namespace Namespace.Extensions
{
public static class StringExtensions
{
public static string ToUpperFirstLetter(this string source)
{
return ....removed for abbreviation
}
}
}

Razor 解析

ITemplate template = Razor.Resolve(template, model);
string result = template.Run(new ExecuteContext());

编辑

我还想在 Dynamic ExpandoObject 上创建一个扩展方法。查看模型中的值是否存在。我收到以下错误消息“System.Dynamic.ExpandoObject”不包含“HasValue”的定义

扩展类

public static class ExpandoObjectExtensions
{
public static bool HasValue(this ExpandoObject source, string key)
{
return ((IDictionary<String, object>)source).ContainsKey(key);
}
}

扩展使用

@if(Model.HasValue("Hello"))
{
@Model.Hello
}

编辑两个

下面的工作和进入扩展方法

var o = new object();
var bool = o.HasValue("value");

动态模型仍然抛出异常 - RuntimeBinderException: 'System.Dynamic.ExpandoObject' does not contain a definition for 'HasValue'

dynamic model = new ExpandoObject();
var bool = model.HasValue("value");

最佳答案

您看到的问题是您尝试执行方法 ToUpperFirstLetter(this string source) 而实际上 Forename 属性是 动态。我想如果你做了类似的事情:

@(((string)Model.Forename).ToUpperFirstLetter())

...它可能会起作用。这完全归功于 dynamic 的使用。动态是在运行时通过后期绑定(bind)处理的,但是当 RazorEngine 正在编译您的 View 时,它会尝试静态链接需要您提供动态的字符串的方法。编译器不知道 Forename 是一个字符串。

您也不能动态第一个参数作为扩展方法的参数,例如:

public static string ToUpperFirsLetter(this dynamic source) { ... }

因为扩展方法在编译时被解析为显式方法调用,但编译器不知道如何处理扩展方法中的动态第一个参数。

编辑根据您的回复,如果您想实现这些类型可能是动态的扩展方法,您最好使用 object 并测试类型,例如:

public static class StringExtensions
{
public static string ToUpperFirstLetter(this object val)
{
string str = val as string;
if (string.IsNullOrWhitespace(str)) return str;

return str.Substring(0, 1).ToUpper() + str.Substring(1);
}
}

public static class ExpandoObjectExtensions
{
public static bool HasValue(this object val, string key)
{
var expando = val as ExpandoObject;
if (expando == null) return false;

return ((IDictionary<string, object>)expando).ContainsKey(key);
}
}

... 不理想,但它仍然是在 dynamic 上使用扩展方法的类型安全方式。

关于c# - 模板中的 RazorEngine 扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11543197/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com