Можно ли использовать метод расширения в классе Object?
Мне было интересно узнать, зарегистрировав этот метод, если вы подверглись штрафу за производительность, поскольку он будет загружен на каждый объект, который был загружен в контексте.
Можно ли использовать метод расширения в классе Object?
Мне было интересно узнать, зарегистрировав этот метод, если вы подверглись штрафу за производительность, поскольку он будет загружен на каждый объект, который был загружен в контексте.
В дополнение к другим ответам:
не было бы штрафа за производительность, поскольку методы расширения - это функция компилятора. Рассмотрим следующий код:
public static class MyExtensions
{
public static void MyMethod(this object) { ... }
}
object obj = new object();
obj.MyMethod();
Вызов MyMethod
будет скомпилирован для:
MyExtensions.MyMethod(obj);
Не будет никакого штрафа за производительность, поскольку он не привязан к каждому типу в системе, он просто доступен для вызова любого типа в системе. Все, что произойдет, это то, что метод будет отображаться на каждом объекте в intellisense.
Вопрос: вам действительно нужно, чтобы он был на объекте, или он может быть более конкретным. Если это нужно для объекта, сделайте его для объекта.
Если вы действительно намерены расширять каждый объект, тогда делать это правильно. Однако, если ваше расширение действительно относится только к подмножеству объектов, оно должно применяться к самому высокому иерархическому уровню, который необходим, но не более.
Кроме того, этот метод будет доступен только там, где импортировано ваше пространство имен.
Я расширил Object
для метода, который пытается применить к указанному типу:
public static T TryCast<T>(this object input)
{
bool success;
return TryCast<T>(input, out success);
}
Я также перегрузил его, чтобы взять success
bool (например, TryParse
):
public static T TryCast<T>(this object input, out bool success)
{
success = true;
if(input is T)
return (T)input;
success = false;
return default(T);
}
С тех пор я расширил это, чтобы попытаться разобрать input
(используя ToString
и используя конвертер), но это усложняется.
Можно ли использовать метод расширения в классе Object?
Да, бывают случаи, когда на самом деле это отличная идея. Нет никакого штрафа за производительность, используя метод расширения класса Object. Пока вы не вызываете этот метод, производительность вашего приложения не будет затронута вообще.
Например, рассмотрим следующий метод расширения, который перечисляет все свойства данного объекта и преобразует его в словарь:
public static IDictionary<string, object> ObjectToDictionary(object instance)
{
var dictionary = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
if (instance != null)
{
foreach (var descriptor in TypeDescriptor.GetProperties(instance))
{
object value = descriptor.GetValue(instance);
dictionary.Add(descriptor.Name, value);
}
}
return dictionary;
}
В следующем примере демонстрируется используемый метод расширения.
namespace NamespaceName
{
public static class CommonUtil
{
public static string ListToString(this IList list)
{
StringBuilder result = new StringBuilder("");
if (list.Count > 0)
{
result.Append(list[0].ToString());
for (int i = 1; i < list.Count; i++)
result.AppendFormat(", {0}", list[i].ToString());
}
return result.ToString();
}
}
}
В следующем примере показано, как этот метод можно использовать.
var _list = DataContextORM.ExecuteQuery<string>("Select name from products").ToList();
string result = _list.ListToString();