2016-03-10 3 views
3

Я хочу создать универсальную функцию, которая примет значение некоторого типа в качестве параметра.Создать экземпляр универсального класса на основе типа NULL

  • Этот тип может быть нулевым или нет.
  • Если значение null, функция возвращает null.
  • Если это не нулевой, и это не пустые значения типа, чем функция должна возвращает MyGenericClass<T>(parameter) (параметр может быть также установлен собственности нет необходимости использовать конструктор здесь)
  • Если это не нуль, и это обнуляемым типа, чем функции должны вернуть что-то вроде MyGenericClass<NotNullType(T)>(parameter.Value)пример: для параметра int? x, функция должна возвращать MyGenericClass<int>(x.Value).

Вот код, который я написал, чтобы сделать такую ​​операцию, но без успеха:

private MyGenericClass GetMyGenericClassOrNull<T> (T value) { 
    if (value != null) { 
     var underlyingType = Nullable.GetUnderlyingType(typeof(T)); 
     if (underlyingType == null) { 
      return new MyGenericClass<T>(value); 
     } else { 
      return new MyGenericClass<underlyingType>(value); 
     } 
    } 
    return null; 
} 

Как вы можете ожидать строку: return new MyGenericClass<underlyingType>(value); проблематично здесь.

Есть ли способ сделать такую ​​вещь?

ответ

2

Вы можете попробовать с:

public class MyGenericClass 
{ 
} 

public class MyGenericClass<T> : MyGenericClass 
{ 
    public MyGenericClass(T value) 
    { 
    } 
} 

public static MyGenericClass GetMyGenericClassOrNull<T>(T? value) where T : struct 
{ 
    if (value != null) 
    { 
     return new MyGenericClass<T>(value.Value); 
    } 

    return null; 
} 

public static MyGenericClass GetMyGenericClassOrNull<T>(T value) 
{ 
    if (value != null) 
    { 
     return new MyGenericClass<T>(value); 
    } 

    return null; 
} 

У вас есть два отдельных методов. Неверные типы перейдут к первому, где T - это тип «базового», который не является нулевым.

Обратите внимание, что вы можете сделать подписи public static MyGenericClass<T> без проблем, если хотите. Непонятно, как строится ваш MyGenericClass.

+1

метод Getter, который возвращает недействительным) – Toddams

+0

@Toddams Исправленная ... мне нужно было сделать это компилируется на моей машине?. – xanatos

2

Вы можете создать экземпляр типового типа, используя Type.MakeGenericType.

Существует проблема с вашим подходом: MyGenericClass<int?> (как пример) не MyGenericClass<int>. Их невозможно отбросить. Тип T с входа отличается от его выхода. Я проигнорировал эту проблему, поставив параметр вторичного типа, который исправляет проблему сейчас.

private static MyGenericClass<T2> GetMyGenericClassOrNull<T, T2>(T value) 
{ 
    if (value != null) 
    { 
     var underlyingType = Nullable.GetUnderlyingType(typeof(T)); 
     if (underlyingType == null) 
     { 
      return new MyGenericClass<T2>((T2)(object)value); 
     } 
     else 
     { 
      Type t = typeof(MyGenericClass<>).MakeGenericType(underlyingType); 

      object o = Activator.CreateInstance(t, value); 

      return (MyGenericClass<T2>)o; 
     } 
    } 
    return null; 
} 

Вы можете использовать его как это:

var x = GetMyGenericClassOrNull<int?, int>(2); 
Смежные вопросы