Программный эквивалент по умолчанию (Тип) - PullRequest
476 голосов
/ 28 ноября 2008

Я использую отражение, чтобы пройти через свойства Type и установить для определенных типов их значения по умолчанию. Теперь я мог бы переключить тип и установить default(Type) явно, но я бы предпочел сделать это в одной строке. Есть ли программный эквивалент значения по умолчанию?

Ответы [ 13 ]

2 голосов
/ 26 июня 2012

Эквивалентно ответу Дрора, но как метод расширения:

namespace System
{
    public static class TypeExtensions
    {
        public static object Default(this Type type)
        {
            object output = null;

            if (type.IsValueType)
            {
                output = Activator.CreateInstance(type);
            }

            return output;
        }
    }
}
0 голосов
/ 10 января 2019

Небольшие корректировки для @ решения Роба Фонсека-Энсора : следующий метод расширения также работает на .Net Standard, поскольку я использую GetRuntimeMethod вместо GetMethod.

public static class TypeExtensions
{
    public static object GetDefault(this Type t)
    {
        var defaultValue = typeof(TypeExtensions)
            .GetRuntimeMethod(nameof(GetDefaultGeneric), new Type[] { })
            .MakeGenericMethod(t).Invoke(null, null);
        return defaultValue;
    }

    public static T GetDefaultGeneric<T>()
    {
        return default(T);
    }
}

... и соответствующий юнит-тест для тех, кто заботится о качестве:

[Fact]
public void GetDefaultTest()
{
    // Arrange
    var type = typeof(DateTime);

    // Act
    var defaultValue = type.GetDefault();

    // Assert
    defaultValue.Should().Be(default(DateTime));
}
0 голосов
/ 31 марта 2014
 /// <summary>
    /// returns the default value of a specified type
    /// </summary>
    /// <param name="type"></param>
    public static object GetDefault(this Type type)
    {
        return type.IsValueType ? (!type.IsGenericType ? Activator.CreateInstance(type) : type.GenericTypeArguments[0].GetDefault() ) : null;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...