Вы можете сделать свой метод расширения универсальным, например ::10000
public static void AddPhoneNumberToContact<T>(
this T contact,
PhoneType type,
String number
)
{
PhoneRow pr = PhoneRow.CreateNew();
pr.SetDefaults();
pr.PtypeIdx = type;
pr.PhoneNumber = number;
((T)contact).Phones.Add(pr);
pr = null;
}
Вы не сможете использовать lock
, поскольку «T» не является ссылочным типом, как того требует оператор блокировки », поэтому вам, возможно, придется вернуть какое-то значение.
Если он жалуется на невозможность разрешить метод Phones для типа T, вы можете:
Передайте некоторый делегат функции , который будет принимать тип T, ничего не возвращать и выполнять действие ((T)contact).Phones.Add(pr);
.
Или вы можете создать интерфейс, подобный следующему:
public interface IPhoneable
{
IList<Phone> Phones();
}
Затем, когда у вас есть этот интерфейс, вы можете добавить следующее в ваш общий метод расширения:
public static void AddPhoneNumberToContact<T>(
this T contact,
PhoneType type,
String number
) where T : IPhoneable {...}
Здесь T
по-прежнему является универсальным типом, но теперь у вашего метода AddPhoneNumberToContact есть требование, чтобы, каким бы T
он ни был, он наследовал от интерфейса IPhoneable, который вы только что определили как метод Phones (). 1022 *
См. Также Метод расширения C # для общих коллекций .