List <t>类型的C#属性,可以接收许多List <types> </types> </t>

时间:2011-12-01 06:45:38

标签: c# wcf generics

我看到很多在线样本都在讨论泛型List<T>

我只是不确定T是否只是叙述者定义“任何类型”的方式,或者我是否可以实际使用语法List<T>来定义可以接收任何类型的属性列表。

如果没有,那么定义可以使用List<MyType>List<YourType>List<AnyType>填充的属性的正确方法是什么?

我问的原因也是因为我的WebService上的属性给了我以下错误:
The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?)

当然我已经有using System.Collections.Generic;了。

消息代码:

using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel;

namespace StackOverflow
{
    [ServiceContract]
    public interface IDbSync
    {
        [OperationContract]
        int UploadTable(SecurityToken token, TableData table);
    }

    [DataContract]
    public class SecurityToken
    {
        string id = "";
        string token = "";

        [DataMember]
        public string ID
        {
            get { return id; }
            set { id = value; }
        }

        [DataMember]
        public string Token
        {
            get { return token; }
            set { token = value; }
        }
    }


    [DataContract]
    public class TableData
    {
        List<T> data;
        string tableName = "";

        [DataMember]
        public string TableName
        {
            get { return tableName; }
            set { tableName = value; }
        }

        [DataMember]
        public List<T> Data
        {
            get { return data; }
            set { data = value; }
        }
    }
}

4 个答案:

答案 0 :(得分:0)

是的,你可以轻松完成

准备好关于c#generics ..............

An Introduction to C# Generics

修改

将属性定义为

class myclass<TValue> 
{     
     public TValue myproperty
     {         
         get {             
               return (TValue)Convert.ChangeType(Value, tyepof(TValue));         
            }     
        }
}

代码

[DataContract]     
public class TableData <T>
    {         List<T> data;         string tableName = "";          [DataMember]         public string TableName         {             get { return tableName; }             set { tableName = value; }         }          [DataMember]         public List<T> Data         {             get { return data; }             set { data = value; }         }     }

答案 1 :(得分:0)

T代表您在声明该类型时应用的类型。让我举一个例子。这是一个使用泛型类型定义的自定义类:

public class MyClass<T>
{
    public T MyProperty { get; set; }
}

此类有一个MyProperty类型的属性T。但这不是真正的类型,它代表您在创建类的实例时编写的类型。

var myClassObject1 = new MyClass<int>();
var myClassObject2 = new MyClass<string>();

从此刻开始,变量myClassObject1的类型为MyClass<int>myClassObject2的类型为MyClass<string>。你得到这样的类的属性:

int intValue = myClassObject1.MyProperty;
string stringValue = myClassObject2.MyProperty;

简而言之就是gererics如何运作的基础知识。对于更深入的信息,我强烈建议您阅读他的答案中提到的“C#Generics简介”Pranay Rana。

修改

您没有在班级中指定类型,请执行以下操作:

[DataContract]      
public class TableData<T>      
{          
    List<T> data;          
    string tableName = "";            

    [DataMember]          
    public string TableName          
    {
        get { return tableName; }              
        set { tableName = value; }          
    }            

    [DataMember]          
    public List<T> Data          
    {              
        get { return data; }              
        set { data = value; }          
    }  
}

答案 2 :(得分:0)

您在T中声明没有TableData类型替换,因此T未知。尝试像这样声明你的课程:

public class TableData<T>

这会为您提供T,并强制消费者创建TableData个实例以及类型:

var myData = new TableData<string>();

以上,每个T类型都将成为string类型。

答案 3 :(得分:0)

当然,它会出错,因为你没有在代码中定义类型T. T代表任何类型的模板...所以你必须定义一个类型,如string,int,object或你可以成为你创建的类的自定义类型。 请参阅代码中的注释。

[DataContract]
public class TableData
{
    List<T> data;                    //Here what do you want in the data object? a List of strings or a List of your custom defined class types? so you declare List<string> data; or List<MyClass> data; Although I prefer you use IList instead of List.
    string tableName = "";

    [DataMember]
    public string TableName
    {
        get { return tableName; }
        set { tableName = value; }
    }

    [DataMember]
    public List<T> Data          //Then here as well you use public IList<string> Data or public IList<Myclass> data and it should be fine.
    {
        get { return data; }
        set { data = value; }
    }
}