![](/img/trans.png)
[英]Mapping strongly-typed DataSets in a generic FillDataSet method in C#?
[英]Is it possible to pass a strongly-typed class as a parameter of a method in C#?
我有以下代码。 我想将其包装在一个方法中,在该方法中,我可以将Resources.Home或Resources.Contact或Resources.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.