Общий метод, возвращающий экземпляр объекта T - PullRequest
2 голосов
/ 24 января 2012

У меня одни и те же классы, но в разных пространствах имен.например: x.InHeaderType, y.InHeaderType и т. д. *

Мне часто приходится создавать экземпляры этих классов с одинаковыми параметрами.

Вот пример:

x.InHeaderType inHeader = new x.InHeaderType();

inHeader.CompanyId = "TEST";
inHeader.UserId = "TEST";
inHeader.Password = "TEST";
inHeader.MessageId = " ";

Можно ли создать такой метод, как:

    public static T GetInHeaderProperty<T>()
    {
        T value;
        // fill the properties of object and return the instance of T
        // I will call it when I need x.InHeaderType or y.InHeaderType
    }

Заранее спасибо,

Ответы [ 5 ]

7 голосов
/ 24 января 2012

Прежде всего, почему у вас один и тот же класс в двух разных пространствах имен?

Я бы создал магическую функцию вроде:

public static T GetInHeaderProperty<T>(Func<T> createObjFunc)
{
    T result = createObjFunc();
    dynamic resultAsDynamic = result as dynamic;
    resultAsDynamic.CompanyId = "Test";
    resultAsDynamic.UserId = "Test";
    resultAsDynamic.Password = "Test";
    resultAsDynamic.MessageId = " ";
    return (T)result;
}

Это может сработать, но я не уверен, что рекомендую это. У вас могут быть другие проблемы с кодом, вынуждающие вас делать такие вещи, которые вы должны сначала исправить.

ОБНОВЛЕНИЕ: Я сделал предположение, что нельзя заставить объекты наследовать один и тот же интерфейс. Если они могут, вы определенно не должны использовать код выше, если они могут, вы должны использовать код ниже:

public static T GetInHeaderProperty<T>() where T : ISomeType, new()
{
    T result = new T();
    result.CompanyId = "Test";
    result.UserId = "Test";
    result.Password = "Test";
    result.MessageId = " ";
    return result;
}
6 голосов
/ 24 января 2012

Вы можете использовать следующий код:

public static T GetInHeaderProperty<T>() where T : new()
{
    dynamic result = new T();
    result.CompanyId = "Test";
    result.UserId = "Test";
    result.Password = "Test";
    result.MessageId = " ";
    return (T)result;
}

Это упрощенная версия ответа Томаса Янссона.Предполагается, что все типы имеют конструктор по умолчанию.

Вы можете назвать его так:

var result = GetInHeaderProperty<x.InHeaderType>();
2 голосов
/ 24 января 2012

Да, вам нужно определить интерфейс или базовый класс со свойствами, которые вы хотите установить, специализировать ваши конкретные типы из этого и использовать общие ограничения, чтобы компилятор знал, что параметр универсального типа имеет эти свойства.

Подробнее: http://msdn.microsoft.com/en-us/library/d5x73970.aspx

1 голос
/ 24 января 2012

Этот код пахнет. Наличие двух одинаковых, но разных пространств имен не очень хорошая идея. Можете ли вы переместить их в общую общую библиотеку?

Я вижу, вы используете сервисные ссылки. Вам нужно иметь ссылки на каждую конечную точку? Не могли бы вы как-то реорганизовать ваши ссылки, чтобы удалить это дублирование?

0 голосов
/ 24 января 2012

Я думаю, вам нужно:

public interface IInHeaderType
{
 string CompanyId { get; set; }
 string UserId { get; set; }
 string Password { get; set; }
 string MessageId { get; set; }
}

public static T GetInHeaderProperty<T>() where T : IInHeaderType, new ()
{
        T value = new T();
        // fill the properties of object and return the instance of T
        // I will call it when I need x.InHeaderType or y.InHeaderType
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...