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#泛型..............
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; }
}
}