2015-07-28 3 views
0

У меня есть следующий код. Я хотел бы обернуть его в методе, где я мог бы пройти Ресурсы. Дом или Ресурсы.Контакт или Ресурсы. Конфиденциальность и т. Д., Где я в настоящее время имею жестко закодированные ссылки на Resources.Home. Каждый из них является ссылкой на строго типизированный класс. Это возможно?Можно ли передать строго типизированный класс в качестве параметра метода в C#?

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); 
+0

Каков тип 'Resources.Home'? –

+0

Сильно типизированный класс. –

+1

Это ничего не значит. Классы * являются * типами, они не могут быть строго типизированы или слабо типизированы. – siride

ответ

1

Я немного смущен вопросом. Если экземпляры объектов нужного типа, то это стандарт 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); 
} 

Таким образом, я предполагаю, что вы хотите передать в «класс» не является объектом и доступа статические члены? Если это ваш план, я бы ожидал, что это может быть сделано с отражением, но это будет беспорядочно, и, возможно, вам лучше подумать о том, чтобы создать экземпляр класса для достижения того же результата?

0

Вы упомянули, что:

Каждый из них является ссылкой на строго типизированный класс

Я бы истолковать, что, как

каждый из них является отдельным (бетон) экземпляр конкретного типа класса

Если моя интерпретация верна, то вам просто необходимо пересмотреть свой метод, чтобы быть

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

Если главная/контакты/экземпляры объектов приватность все разного типа, то вы должны реорганизовать их, если это возможно, чтобы наследовать от общий базовый тип - если это невозможно, используйте перегрузку для создания метода, который принимает каждый конкретный тип.

0

Да, вы можете делать то, что вы просите ... относительно того, или нет, это хороший дизайн код открыт для обсуждения;)

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 

... но это ужасно, и я надеюсь, что причины очевидны (если они не то я могу разработать :)

Если я могу быть достаточно presumtuous читать в проблему, я думаю , который вы пытаетесь решить; похоже, что вы ищете для хорошего строго типизированного метода обработки локализации, где вы можете использовать синтаксический подход Razor для ссылки на строку ресурса, ссылаясь на свойство внутри статической модели ресурсов. Это было бы фантастическим способом справиться с локализацией , поскольку она устойчива к будущим поломкам, поскольку код изменяется/получает рефакторинг.

// 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); 
} 
0

Если я правильно понять ваш вопрос, вы хотите передать строго типизированный объект класса с динамическими значениями в качестве параметр метода и т.д. Вы должны быть легко в состоянии передать его в качестве параметра :)

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); 
    ///.... 
} 

это поможет мне повторно использовать и обобщить свои данные, так что я не вправо и присваивать значение каждый. спасибо надеюсь, что это поможет. С уважением Fahad

+0

У меня нет TypeOfResourceHome где-нибудь в моем коде? :-( –

+0

это было, например, вы можете использовать свой класс модели страницы напрямую. –

+0

Я думаю, это суть моего вопроса. Я не могу понять, что я должен использовать там, где у вас есть «TypeOfResourceHome», который все равно позволит это чтобы быть динамичным. –

Смежные вопросы