c# - Как преобразовать строку в обнуляемый тип, который определяется во время выполнения?



asp.net generics (3)

У меня есть код ниже, и мне нужно преобразовать строку в тип, который также указан из String:

 Type t = Type.GetType("System.Nullable`1[[System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]");

            object d = Convert.ChangeType("2012-02-23 10:00:00", t);

Я получаю сообщение об ошибке ниже:

Invalid cast from 'System.String' to 'System.Nullable`1[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'.

Как это было бы возможно?

Я знаю, что один уродливый способ проверить, является ли тип обнуляемым, используя if:

    Type possiblyNullableType = Type.GetType("System.Nullable`1[[System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]");

    var underlyingType = Nullable.GetUnderlyingType(possiblyNullableType);

    Object result;

    // if it's null, it means it wasn't nullable
    if (underlyingType != null)
    {
        result = Convert.ChangeType("2012-02-23 10:00:00", underlyingType);
    }

Есть ли лучший способ?

Спасибо,

https://src-bin.com


Answer #1

Есть две проблемы.

Во-первых, Convert.ChangeType просто не поддерживает обнуляемые типы.

Во-вторых, даже если бы это было сделано, поместив результат (назначив его object ), вы уже преобразовали бы его в DateTime .

Вы можете в особом случае обнулять типы:

string s = "2012-02-23 10:00:00";
Type t = Type.GetType("System.Nullable`1[[System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]");
object d;

if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>))
{
    if (String.IsNullOrEmpty(s))
        d = null;
    else
        d = Convert.ChangeType(s, t.GetGenericArguments()[0]);
}
else
{
    d = Convert.ChangeType(s, t);
}

Answer #2

Что-то вроде этого? Если вам действительно не нужно делать это динамически.

if (string.IsNullOrEmpty(input))
{
   return new DateTime?();
}
else
{
   return new DateTime?(DateTime.Parse(input));
}

Возможно, вы могли бы проверить, является ли ваш тип одним из «обнуляемых» типов, а затем, возможно, вы найдете здесь что-то полезное:

Преобразовать строку в обнуляемый тип (int, double и т.д ...)


Answer #3
public static T GetValue<T>(string Literal, T DefaultValue)
    {
        if (Literal == null || Literal == "" || Literal == string.Empty) return DefaultValue;
        IConvertible obj = Literal;
        Type t = typeof(T);
        Type u = Nullable.GetUnderlyingType(t);

        if (u != null)
        {
            return (obj == null) ? DefaultValue : (T)Convert.ChangeType(obj, u);
        }
        else
        {
            return (T)Convert.ChangeType(obj, t);
        }
    }




nullable