繁体   English   中英

是否可以将强类型的类作为C#中方法的参数传递?

[英]Is it possible to pass a strongly-typed class as a parameter of a method in C#?

我有以下代码。 我想将其包装在一个方法中,在该方法中,我可以将Resources.HomeResources.ContactResources.Privacy等传递到其中,而目前我对Resources.Home进行了硬编码。 这些中的每一个都是对强类型类的引用。 这可能吗?

Localization localization = new Localization();
FrameworkModel model = new FrameworkModel();
model.Page = new PageModel();
model.Page.Scripts = new PageModel.PageScripts();
model.Page.TwoLetterISOLanguageName = ((Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName) != null ? Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName : "en");
model.Page.CurrentUICultureName = ((Thread.CurrentThread.CurrentUICulture.Name) != null ? Thread.CurrentThread.CurrentUICulture.Name : "en-us").ToLower();
model.Page.Title = localization.LocalizeText(Resources.Home.Title);
model.Page.Keywords = localization.LocalizeText(Resources.Home.Keywords);
model.Page.Description = localization.LocalizeText(Resources.Home.Description);
model.Page.RSS = localization.LocalizeText(Resources.Home.RSS);
model.Page.Scripts.Header = localization.LocalizeText(Resources.Home.ScriptsHeader);
model.Page.Scripts.Footer = localization.LocalizeText(Resources.Home.ScriptsFooter);
model.Page.Body = localization.LocalizeText(Resources.Home.Body);

这个问题让我有些困惑。 如果您实例化了正确类型的对象,那么它就是标准的C#,对:

void YourFunction(TypeOfResourceHome home) {
    Localization localization = new Localization();
    FrameworkModel model = new FrameworkModel();
    model.Page = new PageModel();
    model.Page.Scripts = new PageModel.PageScripts();
    ...
    model.Page.Title = localization.LocalizeText(home.Title);
    model.Page.Keywords = localization.LocalizeText(home.Keywords);
    model.Page.Description = localization.LocalizeText(home.Description);
    model.Page.RSS = localization.LocalizeText(home.RSS);
    model.Page.Scripts.Header = localization.LocalizeText(home.ScriptsHeader);
    model.Page.Scripts.Footer = localization.LocalizeText(home.ScriptsFooter);
    model.Page.Body = localization.LocalizeText(home.Body);
}

因此,我假设您要传递“类”而不是对象和访问静态成员? 如果这是您的计划,那么我希望可以通过反射来完成,但是会很杂乱,也许您最好考虑实际创建该类的实例以实现相同的结果?

您提到:

这些都是对强类型类的引用

我会解释为

这些中的每一个都是特定类型类的单独(具体)实例

如果我的解释正确,那么您只需要重新定义您的方法即可

public void Method([specific type of your home/contact/privacy object] settings)
{
    model.Page.Title = localization.LocalizeText(settings.Title);
}

如果home / contact / privacy对象实例都是不同的类型,则应尽可能重构它们以从通用基本类型继承-如果不可能,则使用重载来创建采用每种特定类型的方法。

是的,您可以按自己的要求去做...关于是否一个好的代码设计尚有争议;)

void CreatePageModel<TTitle, TKeyword, TDescription, TRSS, TScriptsHeader, TScriptsFooter, TBody>()
{
    var model = new FrameworkModel();
    ...
    model.Page.Title = localization.LocalizeText(typeof(TTitle));
    model.Page.Keywords = localization.LocalizeText(typeof(TKeywords));
    model.Page.Description = localization.LocalizeText(typeof(TDescription));
    model.Page.RSS = localization.LocalizeText(typeof(TRSS));
    model.Page.Scripts.Header = localization.LocalizeText(typeof(TScriptsHeader));
    model.Page.Scripts.Footer = localization.LocalizeText(typeof(TScriptsFooter));
    model.Page.Body = localization.LocalizeText(typeof(TBody));
}

..并将上面的代码称为

CreatePageModel<TitleClassName, KeywordClassName... etc

...但是这太可怕了,我希望原因很明显(如果没有,那么我可以详细说明:)

如果我很冒昧地读了这个问题,我认为您正在尝试解决; 似乎您正在寻找一种很好的处理本地化的强类型方法,在该方法中,您可以采用Razor语法方法通过引用Resources静态模型中的属性来引用资源字符串。 这将是处理本地化的一种绝妙方法,因为它可以随着代码更改/重构而适应将来的破坏。

// NOTE: This could/should be automatically generated from the resources file
public class Resources 
{
    public class HomeResources
    {
        public string Title { get; set; }
        public string Keywords { get; set; }
        public string Description { get; set; }
        public string RSS { get; set; }
        public string ScriptsHeader { get; set; }
        public string ScriptsFooter { get; set; }
        public string Body { get; set; }
    }

    public HomeResources Home { get; set; }

    ...
    // Other categorisations of resources
    ...
}

public class Localisation
{
    private Resources _resources;

    public Localisation(Resources resources)
    {
        _resources = resources;
    }

    public LocaliseText<TProperty>(Expression<Func<Resources, TProperty>> expr)
    {
        // Borrow functionality from MVC to get the string representation
        // of the expression property reference e.g.
        //    r => r.Home.Title   =>   "Home.Title"
        var propertyName = ExpressionHelper.GetExpressionText(expr);

        //.. Do your string resource lookup
    }
}

现在,您可以使用强类型代码将本地化页面模型设置为:

void CreatePageModel()
{
    var localization = new Localization();
    var model = new FrameworkModel();
    ...
    model.Page.Title = localization.LocalizeText(r => r.Home.Title);
    model.Page.Keywords = localization.LocalizeText(r => r.Home.Keywords);
    model.Page.Description = localization.LocalizeText(r => r.Home.Description);
    model.Page.RSS = localization.LocalizeText(r => r.Home.RSS);
    model.Page.Scripts.Header = localization.LocalizeText(r => r.Home.ScriptsHeader);
    model.Page.Scripts.Footer = localization.LocalizeText(r => r.Home.ScriptsFooter);
    model.Page.Body = localization.LocalizeText(r => r.Home.Body);
}

如果我正确地理解了您的Question,那么您想传递具有动态值的强类型类对象作为方法等的参数。您应该可以轻松地将其作为参数传递:)

void YourFunction(TypeOfResourceHome Resources)
        {
            Localization localization = new Localization();
            FrameworkModel model = new FrameworkModel();
            model.Page = new PageModel();
            model.Page.Scripts = new PageModel.PageScripts();
            //    .....
            model.Page.Title = localization.LocalizeText(Resources.Home.Title);
            model.Page.Keywords = localization.LocalizeText(Resources.Home.Keywords);
            //     .....
            model.Page.Body = localization.LocalizeText(Resources.Home.Body);
            //       ....
        }

但是,如果执行此操作,我会将类传递给FrameworkModel()类的构造函数,即,您可以在FrameworkModel类中尝试这样

public FrameworkModel(TypeOfResourceHome resources)
{
    page= new PageModel();
    page.Title = localization.LocalizeText(resources.home.Title);
    ///....
}

它将帮助我重用和概括我的数据,从而不必每次正确分配值。 希望对您有所帮助。 关于法哈德

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM