Подтвердить что ты не робот

Метод расширения С# для объекта

Можно ли использовать метод расширения в классе Object?

Мне было интересно узнать, зарегистрировав этот метод, если вы подверглись штрафу за производительность, поскольку он будет загружен на каждый объект, который был загружен в контексте.

4b9b3361

Ответ 1

В дополнение к другим ответам:

не было бы штрафа за производительность, поскольку методы расширения - это функция компилятора. Рассмотрим следующий код:

public static class MyExtensions
{
    public static void MyMethod(this object) { ... }
} 

object obj = new object();
obj.MyMethod();

Вызов MyMethod будет скомпилирован для:

MyExtensions.MyMethod(obj);

Ответ 2

Не будет никакого штрафа за производительность, поскольку он не привязан к каждому типу в системе, он просто доступен для вызова любого типа в системе. Все, что произойдет, это то, что метод будет отображаться на каждом объекте в intellisense.

Вопрос: вам действительно нужно, чтобы он был на объекте, или он может быть более конкретным. Если это нужно для объекта, сделайте его для объекта.

Ответ 3

Если вы действительно намерены расширять каждый объект, тогда делать это правильно. Однако, если ваше расширение действительно относится только к подмножеству объектов, оно должно применяться к самому высокому иерархическому уровню, который необходим, но не более.

Кроме того, этот метод будет доступен только там, где импортировано ваше пространство имен.

Я расширил 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 и используя конвертер), но это усложняется.

Ответ 4

Можно ли использовать метод расширения в классе 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;
}

Ответ 5

В следующем примере демонстрируется используемый метод расширения.

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();