c#类型List可以接收许多List< type >

本文关键字:List 许多 type 类型 | 更新日期: 2023-09-27 18:16:32

我看到许多在线示例讨论泛型List<T>

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

如果不是,那么什么是正确的方式来定义一个属性,可以用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; }
        }
    }
}

c#类型List<T>可以接收许多List< type >

是的,你可以很容易做到

准备好了解c#泛型..............

c#泛型简介

编辑

将属性定义为

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; }         }     }

您在TableData中声明没有T类型的替代品,因此T是未知的。试着这样声明你的类:

public class TableData<T>

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

var myData = new TableData<string>();

上面,每个T类型都将变成string类型。

T表示在声明该类型时应用的类型。我来举个例子。下面是用泛型类型定义的自定义类:

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

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

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

从现在开始,变量myClassObject1的类型是MyClass<int>, myClassObject2的类型是MyClass<string>。你可以得到这样的类属性:

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

简而言之,这就是泛型的基本工作原理。要了解更深入的信息,我强烈建议您阅读Pranay Rana在他的回答中提到的"c#泛型入门"。

编辑

你没有在你的类中指定类型,这样做:

[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; }          
    }  
}

肯定会出错,因为您没有在代码中定义类型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; }
    }
}
相关文章: