我看到很多在线样本都在讨论泛型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; }
}
}
}
答案 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; }
}
}