2013-12-02 3 views
0

можно ли передать enum в качестве параметра в общую функцию? В приведенном ниже коде я хочу, чтобы функция CreateInstance получала параметр enum в соответствии с заданным типом. Пример кода объясняет вопрос лучше:Передать различные перечисления методу в соответствии с общим типом

public class DrivedA 
{ 
    public string myfieldA{get;set;} 
    public enum DrivedA_Attributes { 
     A, 
     B, 
     C, 
    } 

    public void Set(params DerivedClassExtraParameters<DrivedA>[] p) 
    { 
     //some code 
    } 
} 

public class DrivedB 
{ 
    public string myfieldB { get; set; } 
    public enum DrivedB_Attributes 
    { 
     D, 
     E, 
     F, 
    } 

    public void Set(params DerivedClassExtraParameters<DrivedB>[] p) 
    { 
     //some code 
    } 
} 

public class DerivedClassExtraParameters<T> 
{ 
    internal object myFieldD; 
    internal string myName; 
    static public DerivedClassExtraParameters<T> CreateInstance(Enum name, object value) 
    { 
     DerivedClassExtraParameters<T> instance = new DerivedClassExtraParameters<T>(); 
     instance.myFieldD = value; 
     instance.myName = name.ToString(); 
     return instance; 
    } 
} 

public class TestClass 
{ 
    public static void Main(string[] args) 
    { 
     DerivedClassExtraParameters<DrivedB> pB = DerivedClassExtraParameters<DrivedB>.CreateInstance(DrivedB.DrivedB_Attributes.D,"1"); 

     DrivedB b = new DrivedB(); 
     b.Set(pB); 

     //Line #X, I want this line to give error since DerivedClassExtraParameters<DrivedA>.CreateInstance function should get DrivedA.DrivedA_Attributes enum as parameter, not DrivedB.DrivedB_Attributes. 
     DerivedClassExtraParameters<DrivedA> pA =  DerivedClassExtraParameters<DrivedA>.CreateInstance(DrivedB.DrivedB_Attributes.D, "1"); 

     DrivedA a = new DrivedA(); 
     a.Set(pA); 
    } 

} 
+0

вы имеете в виду 'статических открытых DerivedClassExtraParameters CreateInstance (имя TEnum, значение объекта)'? – Grundy

+0

coder может не знать, какое перечисление использовать, и я хочу предотвратить ошибки времени выполнения. Я не хочу использовать другие generics (TEnum), я хочу, чтобы система поняла правильное перечисление из типа класса (T). Возможно ли, или я могу достичь такой же функциональности с помощью другого подхода? – aldebaran

+0

Какова цель этих перечислений? – Dennis

ответ

0

Ваши неправильные способы использования дженериков. Вы должны попробовать это.

public class DerivedClassExtraParameters<T> 
{ 
    internal T myFieldD; 
    internal string myName; 
    static public DerivedClassExtraParameters<T> CreateInstance(T value) 
    { 
     DerivedClassExtraParameters<T> instance = new DerivedClassExtraParameters<T>(); 
     instance.myFieldD = value; 
     instance.myName = value.GetType().Name; 
     return instance; 
    } 
} 

Вам даже не нужен статический метод CreateInstance. Вы можете просто сделать это

public class DerivedClassExtraParameters<T> 
    { 
     internal T myFieldD; 
     internal string myName; 

     public DerivedClassExtraParameters(T value) 
     { 
       myFieldD = value; 
       myName = value.GetType().Name; 
     } 
    } 
+0

Спасибо, это решение, но не решение моей проблемы. Проверьте основной метод. Кодер знает что-нибудь о классе DerivedClassExtraParameters, он просто знает, для какого класса (DrivedA или DrivedB, в реальном проекте их много) он должен его создать. Поэтому я хочу дать ошибку компиляции, если он использует неправильное перечисление. – aldebaran

+0

Если вы используете мою реализацию, ваша строка вызовет ошибку компиляции. Действительно DerivedClassExtraParameters .CreateInstance в моей реализации будет принимать только параметр типа DrivedA. Что еще вы хотите? –

+0

в качестве параметра должен принимать DrivedA.DrivedA_Attributes, а не DrivedA. – aldebaran

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