Array
(
)

Variável do Tipo Genérico

Weslei Santos
   - 02 jan 2013

Olá pessoal,
Eu tenho a seguinte situação:
#Código

using System;
using System.Collections.Generic;

namespace wds.data
{
    public class TRegister : TObject
    {
        private TDataSet<TRegister> FDataSet;
        
        internal void DataSet(TDataSet<TRegister> ADataSet)
        {
            FDataSet = ADataSet;
        }
    }
}

#Código
using System.Collections.Generic;
using System.Reflection;

namespace wds.data
{
    public class TDataSet<T> : TObject, IDataSet<T> where T : TRegister, new()
    {
        private T FRecordBuff;
        
        internal void NewRecordBuff()
        {
            FRecordBuff = new T();
            FRecordBuff.DataSet(this); // ERROR : The best overloaded method match for 'wds.data.TRegister.DataSet
                                       // (wds.data.TDataSet<wds.data.TRegister>)' has some invalid arguments.

        }
    }
}

Como faço para declarar uma variável, de um tipo genérico, em TRegister, sem precisar dizer que TRegister é também de um tipo genérico? Em Java, basta colocar uma ? (ex: private TDataSet<?> FDataSet;) que ele entende perfeitamente. Como posso fazer isso em C#?
Alguém pode me ajudar?

Robson Robsonalves.net
   - 02 jan 2013

Pra você declara uma váriavel genérica, ela só vai existir dentro uma classe do mesmo tipo.
Ele não entende que o escopo é genérico.

No caso sua classe TRegister deverá ser declarada como TRegister<T>, assim o tipo passado para a classe é o tipo que será passado para a variável!

A vantagem do genérico e que o tipo não seja discriminado, mas deve existir um tipo.

Já tive necessidades parecidas e nunca vi material que permitisse trabalhar, igual ao que você citou de Java, vou ver se encontro material, pois me interessou tmb.

0
|
0

Weslei Santos
   - 02 jan 2013

Olá Robson,

Obrigado por me responder. O projeto que eu estou desenvolvendo em C# eu o tenho em java web, funcionando perfeitamento. O problema de eu declarar a classe TRegister como classe genérica (TRegister<T>), terei que rever todo o meu diagrama de classe. Como citei anterior mente, em java, basta colocar ? (ex: Class<?>) que ele assume o tipo em runtime. É a primeira vez que desenvolvo em C#. Vou tenhar ver o que eu consigo fazer aqui.

Obrigado!

0
|
0

Robson Robsonalves.net
   - 02 jan 2013

Você pode usar o tipo genérico var.
ele comporta qualquer tipo por ser um do tipo object, mas ainda não sei como montar um TRegister<T> sem o T existir no escopo :/

Qualquer solução posta ae.

0
|
0

José
   - 27 jul 2013

Olá amigos, como aparentemente a duvida foi solucionada, vou dar o tópico por concluído.
Obrigado pela participação de todos.

0
|
0