C# 访问Kentico自定义对象宏方法中的嵌套属性

C# 访问Kentico自定义对象宏方法中的嵌套属性,c#,asp.net,kentico,C#,Asp.net,Kentico,我试图在Kentico(v8.2.x或v9.0)中编写一个宏方法,该方法被适当地缓存,并公开一个包含几个公共成员的POCO 在VisualStudio中调试时,我可以看到查询运行良好,并且返回的对象实例正是我想要的。此外,使用Kentico中的Debug应用程序检查缓存项也会显示完整的POCO实例数据已按预期进行缓存 但是,调用宏时,我似乎只能读取对象的字符串表示形式 它是一个扩展了CurrentUserInfo类型的宏,因此我尝试这样调用它: {% CurrentUser.ClientStat

我试图在Kentico(v8.2.x或v9.0)中编写一个宏方法,该方法被适当地缓存,并公开一个包含几个公共成员的POCO

在VisualStudio中调试时,我可以看到查询运行良好,并且返回的对象实例正是我想要的。此外,使用Kentico中的
Debug
应用程序检查缓存项也会显示完整的POCO实例数据已按预期进行缓存

但是,调用宏时,我似乎只能读取对象的字符串表示形式

它是一个扩展了
CurrentUserInfo
类型的宏,因此我尝试这样调用它:

{% CurrentUser.ClientStatus() %}
{% CurrentUser.ClientStatus().Summary %}
但是尝试检索任何嵌套属性都失败

我确信这只是因为我没有做一些事情(比如正确注册这些属性)。但是从现在起,我看到了很多可能的事情。例如:

  • 命名源
  • 命名回调源
  • 匿名来源
  • 或者以某种方式将它们注册为单独的字段
以下是宏本身:

/// <summary>
/// A class containing custom user-extension macros.
/// </summary>
[assembly: RegisterExtension(typeof(CustomUserMacros), typeof(CurrentUserInfo))]
public class CustomUserMacros : MacroMethodContainer
{
    /// <summary>
    /// Retrieves data regarding user client.
    /// </summary>
    /// <param name="context">The context.</param>
    /// <param name="parameters">The parameters.</param>
    /// <returns>Data regarding user client information.</returns>
    [MacroMethod(typeof(ClientInfo), "Retrieves client info.", 1)]
    [MacroMethodParam(0, "user", typeof(CurrentUserInfo), "The user.")]
    public static object ClientStatus(
            EvaluationContext context,
            params object[] parameters)
    {
        ClientInfo retVal = null;
        if (parameters != null && parameters.Length > 0
                && parameters[0].GetType() == typeof(CurrentUserInfo))
        {
            var siteName = SiteContext.CurrentSiteName;
            var userGuid = ((CurrentUserInfo)parameters[0]).UserGUID;
            var uInfo = UserInfoProvider.GetUserInfoByGUID(userGuid);
            retVal = CacheHelper.Cache(
                cs => new ClientInfo(uInfo, siteName),
                new CacheSettings(
                    60, 
                    typeof(CustomUserMacros), 
                    "ClientStatus", 
                    userGuid));
        }

        return retVal;
    }
}
对于我来说,以类似于以下方式访问属性的最简单方法是什么

{% CurrentUser.ClientStatus().ClientRecord["< Column Name >"] %}
{%CurrentUser.ClientStatus().ClientRecord[“”]%}

首先,我建议您使用系统->宏->控制台来测试您的宏-这非常有用。 在您的情况下,您应该能够访问如下属性:

{% CurrentUser.ClientStatus() %}
{% CurrentUser.ClientStatus().Summary %}

为了能够以您描述的方式访问属性,父对象必须是
DataRow
DataRowView
类型,或实现以下接口之一:
IVirtualHierarchicalObject
IHierarchicalObject
IDataContainer
ISimpleDataContainer

在您的情况下,
ClientInfo
应该实现
IDataContainer
。嵌套的
CustomTableItem
已经实现了从
AbstractInfo
继承的一个接口

您必须实现几个成员,这些成员主要使用一个名为
columnName
的参数来识别应该返回其值的成员:

public class ClientInfo : IDataContainer
{
    ...
    public object GetValue(string columnName)
    {
        switch (columnName)
        {
            case "ClientRecord":
                return ClientRecord;

            case "Summary":
                return Summary;

            case "MediaPaths":
                return MediaPaths;
        }
        return null;
    }
    ...
}

在这种情况下可能不起作用,但值得注意的是,您可以使用
CMS.Base.DataContainer
IEnumerable
返回简单的对象值:

返回myCollection.Select(myObj=>newdatacontainer
{
[“Value1”]=myObj.Value1,
[“Value2”]=myObj.Value2
});

进一步阅读后,我认为在我的情况下,最好使用自定义模块。尽管如此,我还是会把问题留在这里,因为我喜欢K#macros,我相信理解如何让上述功能发挥作用仍然是有用的!好问题!关于宏的文档有点复杂,但这确实解决了我过去遇到的一些问题。我实现了所有的接口成员(除了
集合
成员),它工作起来很有魅力!非常感谢