C # Передача типа класса в качестве параметра

Это для C #? Передача типа класса в качестве параметра

У меня есть адаптер класса, который реализует интерфейс. Я хочу заполнить структуру массива экземплярами MyFooClass, где имя или ссылка MyFooClass я хочу получить извне. Я создаю их в своем коде адаптера.

Например:

    public void FillWsvcStructs(DataSet ds, ClassType Baz)
    {
        IFoo.Request = ds.DataTable[0].Request;
        IFoo.Modulebq = string.Empty;
        IFoo.Clasific = string.Empty;
        IFoo.Asignadoa = ds.DataTable[0].Referer;
        IFoo.Solicita = "Jean Paul Goitier";


        // Go with sub-Elems (Also "Interfaceated")
        foreach (DataSet.DataTableRow ar in ds.DataTable[1])
        {
            if ((int) ar.StatusOT != (int)Props.StatusOT.NotOT)
            {
                ///From HERE!
                IElemRequest req = new (Baz)(); // I don't know how to do it here
                ///To HERE!

                req.Id = string.Empty;
                req.Type = string.Empty;
                req.Num = string.Empty;
                req.Message = string.Empty;
                req.Trkorr = ar[1];
                TRequest.Add(req);
            }
        }
    }
 apacay06 июн. 2012 г., 19:48
Был ответ, который заявил, что использовать.ToThisType() а также.ToTheOtherType() иметь один и тот же класс, управляющий тем, что он получит ... потому что в какой-то момент используемый вами класс знает, что он должен получить. Это было довольно полезно тоже. Жаль, я не могу Upvote, так как он был удален. Однако теперь вы знаете, что решение также существует. Спасибо,unsung hero!

Ответы на вопрос(6)

public void FillWsvcStructs<T>(DataSet ds) where T : IElemRequest, new() {
    ...
    IElemRequest req = new T();
    ...
}

Вызов метода:

FillWsvcStructs<Bez>(ds);
 06 июн. 2012 г., 13:43
FillWsvcStructs & lt; T, U, V & gt; (DataSet ds), где T: IElemRequest, new (), где U: IElemRequest, new (), где V: IElemRequest, new () {}
 apacay05 июн. 2012 г., 22:27
Что делать, если существует более 1 элемента с типом интерфейса для создания экземпляра?public void FillWsvcStructs<TBaz, TBar, TQux> Как мне это объявить?

Это, вероятно, лучше всего решить с помощью обобщений:

public void FillWsvcStructs<T>(DataSet ds) where T : IElemRequest, new()
{
   //..
   //new() constraint enables using default constructor     
   IElemRequest req = new T(); 
   //IElemRequest constraint enables using interface properties
   req.Id = string.Empty;
   //..
 }

Если у вас есть несколько типов, к которым вам нужно иметь доступ / создавать экземпляры, объявление следует тем же правилам (которые могут быть легко получены из msdn):

public void FillWsvcStructs<T, U, V>() where T : IElemRequest, new() 
                                       where U : IFoo, new()
                                       where V : IBar, new()
{

    //..
}
 apacay05 июн. 2012 г., 22:27
Что делать, если существует более 1 элемента с типом интерфейса для создания экземпляра?public void FillWsvcStructs<TBaz, TBar, TQux> Как мне это объявить?
 05 июн. 2012 г., 22:32
@apacay: обновлено

общий:

public void FillWsvcStructs<TBaz>(DataSet ds) where TBaz : IElementRequest, new()
{
    // ...
    IElementRequest req = new TBaz();
    // ...
}

Общее ограничение (& quot;where...& quot;) обеспечивает, что тип, который вы передаете, реализуетIElementRequest интерфейс и что он имеет конструктор без параметров.

Предполагая, что у вас был классBaz похоже на это:

public class Baz : IElementRequest
{
    public Baz()
    {
    }
}

Вы бы вызвали этот метод так:

DataSet ds = new DataSet();
FillWsvcStructs<Baz>(ds);
Addendum

Несколько, разные, универсальные параметры типа могут иметь свое собственное ограничение типа:

public void FillWsvcStructs<TFoo, TBar, TBaz>(DataSet ds) 
    where TFoo : IFoo, new()
    where TBar : IBar, new()
    where TBaz : IElementRequest, new()
{
    // ...
    IFoo foo = new TFoo();
    IBar bar = new TBar();
    IElementRequest req = new TBaz();
    // ...
}
 apacay05 июн. 2012 г., 22:27
Что делать, если существует более 1 элемента с типом интерфейса для создания экземпляра?public void FillWsvcStructs<TBaz, TBar, TQux> Как мне это объявить?
 05 июн. 2012 г., 23:43
Вы можете добавить столько ограничений типа, сколько у вас есть параметров типа. Смотрите мое редактирование.

Я думаю ты хочешьдженерики.

Объявите свой метод следующим образом:

public void FillWsvcStructs<T>(DataSet ds)
    where T : IElemRequest, new()
{
    //You can then do
    IElemRequest req = new T();

}

new() ограничение требуетT иметь открытый конструктор без параметров, иIElemRequest ограничение гарантирует, что он реализуетIElemRequest.

 apacay05 июн. 2012 г., 22:27
Что делать, если существует более 1 элемента с типом интерфейса для создания экземпляра?public void FillWsvcStructs<TBaz, TBar, TQux> Как мне это объявить?

Вы, вероятно, хотите использоватьActivator.CreateInstance.

IElemRequest req = (IElemRequest) Activator.CreateInstance(Baz);

Если тип, которыйBaz Представляет собой конструктор, который принимает параметры, сложность которых будет расти (так как вам придется использовать рефлексию или динамические вызовы, чтобы это работало). ЕслиBaz не представляет тип, который наследуется отIElemRequest, вы получите уродливую ошибку во время выполнения.

Решение Вопроса

Дженерики а такжеих ограничения надо делать что хочешь я считаю

ClassType>(DataSet ds) where ClassType : IElemRequest, new()
{
    IFoo.Request = ds.DataTable[0].Request;
    IFoo.Modulebq = string.Empty;
    IFoo.Clasific = string.Empty;
    IFoo.Asignadoa = ds.DataTable[0].Referer;
    IFoo.Solicita = "Jean Paul Goitier";


    // Go with sub-Elems (Also "Interfaceated")
    foreach (DataSet.DataTableRow ar in ds.DataTable[1])
    {
        if ((int) ar.StatusOT != (int)Props.StatusOT.NotOT)
        {
            IElemRequest req = new ClassType();

            req.Id = string.Empty;
            req.Type = string.Empty;
            req.Num = string.Empty;
            req.Message = string.Empty;
            req.Trkorr = ar[1];
            TRequest.Add(req);
        }
    }
}
 apacay05 июн. 2012 г., 22:33
У тебя есть мой топор! и мой принятый ответ!
 05 июн. 2012 г., 22:31
Вы получили это шеф!public void FillWsvcStructs<TBaz, TBar, TQux>(DataSet ds) where TBaz: IElemRequest, new() where TBar: TElemRequest, new() where Qux : IElemRequest, new()
 apacay05 июн. 2012 г., 22:27
Что делать, если существует более 1 элемента с типом интерфейса для создания экземпляра?public void FillWsvcStructs<TBaz, TBar, TQux> Как мне это объявить?

Ваш ответ на вопрос