Якщо ви використовуєте .NET 4.0 або новішої версії, і вам потрібна програмна версія, яка не є кодифікацією правил, визначених поза кодом , ви можете створитиExpression
, компілювати та запустити його на ходу.
Наступний метод розширення прийме a Type
і отримає значення, що повертається default(T)
через Default
метод на Expression
класі:
public static T GetDefaultValue<T>()
{
// We want an Func<T> which returns the default.
// Create that expression here.
Expression<Func<T>> e = Expression.Lambda<Func<T>>(
// The default value, always get what the *code* tells us.
Expression.Default(typeof(T))
);
// Compile and return the value.
return e.Compile()();
}
public static object GetDefaultValue(this Type type)
{
// Validate parameters.
if (type == null) throw new ArgumentNullException("type");
// We want an Func<object> which returns the default.
// Create that expression here.
Expression<Func<object>> e = Expression.Lambda<Func<object>>(
// Have to convert to object.
Expression.Convert(
// The default value, always get what the *code* tells us.
Expression.Default(type), typeof(object)
)
);
// Compile and return the value.
return e.Compile()();
}
Ви також повинні кешувати вказане вище значення на основі Type
, але пам'ятайте, якщо ви викликаєте це для великої кількості Type
примірників, і не використовуєте його постійно, пам'ять, що споживається кешем, може перевершити переваги.