2015-01-22 7 views
1

Я пытаюсь создать общий метод для загрузки настроек формы в .NET C#, где каждый параметр будет содержать собственный блок catch try (чтобы продолжить с другими настройками, когда один из них не является действует). Однако я не могу понять, как обойти назначение приложения к объекту. Учетщик не позволяет мне явно лить тип объекта.не может неявно преобразовывать System.Type в объект

private void LoadFormSettings(object o) 
{ 
    try 
    { 
    //Load settings when application is started 
    Type t = o.GetType(); 

    // Operator '<' cannot be applied to operands of type 'method group' and 'System.Type' 
    o = getAppSetting<o.GetType()>("Setting"); 
    // Cannot implicitly convert type 't' to 'object' 
    o = getAppSetting<t>("Setting"); 
    // The type arguments for method... cannot be inferred from the usage. Try specifying the type arguments explicitly 
    o = getAppSetting("Setting"); 
    } 
    catch (Exception ee) 
    { 
    } 
} 

private T getAppSetting<T>(string key) 
{ 
    string value = config.AppSettings.Settings[key].Value; 
    if (typeof(T) == typeof(Point)) 
    { 
    string[] values = value.Split(','); 
    return (T) Convert.ChangeType(value, typeof(T)); 
    } 
} 
+0

Вы не можете использовать экземпляры класса 'Type' (значение, известное во время выполнения) как общие параметры (необходимо знать во время компиляции). Вместо этого вы можете сделать свой общий метод. – CodesInChaos

+0

Ваш шаблон обработки исключений - не очень хорошая идея. 1) Вы ловите все исключения, а не только те, которых вы ожидаете. 2) Избегайте бросать эти исключения в первую очередь, например, используя «TryParse». – CodesInChaos

ответ

1

Type является типом и t является экземпляром. Generic требует типа вместо экземпляра. Вы можете написать только F<Type>() вместо F<t>(). В вашем случае лучше писать

Type t = o.GetType(); 
o = getAppSetting("Setting", t); 

object getAppSetting(string key, Type t) 
{ 
    string value = config.AppSettings.Settings[key].Value; 
    if (t == typeof(Point)) 
    { 
    string[] values = value.Split(','); 
    return Convert.ChangeType(value, t); 
    } 
} 
+0

Большое спасибо, он работает. Я не думал об этом. – Almis

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