public static class Extensions
{
public static T TryCast<T>(this object parent)
where T : class
where this : class
{
T child = (T)Activator.CreateInstance(typeof(T));
foreach (PropertyInfo prop in parent.GetType().GetProperties())
{
child.GetType().GetProperty(prop.Name)?.SetValue(child, prop.GetValue(parent));
}
return child;
}
}
TryCast может использоваться как:
someString.TryCast ()
, но не ограничивается только классами, так как "гдеthis: class «возвращает синтаксическую ошибку», что означает, что без ограничения «this: class» он будет появляться с такими переменными, как int, char и т. д.
Я ищу способ ограничения типа«этот родительский объект» только для переменных класса, поскольку в моем случае использования не имеет смысла использовать его на простых типах, таких как int и char.
Примечание:
Можно захватить и ограничить тип родительского элемента следующим образом:
public static T2 TryCastWorse<T, T2>(this T parent)
where T : class
where T2 : class
{
T2 child = (T2)Activator.CreateInstance(typeof(T2));
foreach (PropertyInfo prop in parent.GetType().GetProperties())
{
child.GetType().GetProperty(prop.Name)?.SetValue(child, prop.GetValue(parent));
}
return child;
}
И затем использовать его следующим образом:
someString.TryCastWorse ()
Это не оптимально, так как нужно указать класс вызывающей переменной, как указано в первом типе в <>, который является строкой, которая всегда должна быть равна someString.
Это не предназначенная функциональность в данном случае, так какможет привести к ошибкам в некоторых случаях использования.