基于另一个成员类型的C#.NET类成员类型
有一个类定义了一个几何体,它包括两个成员,“类型”和“坐标”基于另一个成员类型的C#.NET类成员类型,c#,.net,wcf,class,C#,.net,Wcf,Class,有一个类定义了一个几何体,它包括两个成员,“类型”和“坐标” 是否有一种方法可以根据“type”的值动态定义坐标成员类型?例如,如果“类型”是“多行线”,则坐标类型将是字符串?否,这是不可能的。最接近的方法是定义如下的泛型类: [DataContract] public class geometry<T> where T : struct { [DataMember] public T coordinates; } var geom = new geometry&l
是否有一种方法可以根据“type”的值动态定义坐标成员类型?例如,如果“类型”是“多行线”,则坐标类型将是字符串?否,这是不可能的。最接近的方法是定义如下的泛型类:
[DataContract]
public class geometry<T> where T : struct
{
[DataMember]
public T coordinates;
}
var geom = new geometry<float>();
geom.coordinates = 1.0f;
[DataContract]
public class geometry<T> where T : struct
{
[DataMember]
public readonly string type = typeof(T).Name;
[DataMember]
public T coordinates;
}
var geom = new geometry<float>();
Console.WriteLine(geom.type); // Single
[DataContract]
公共类几何体,其中T:struct
{
[数据成员]
公共T坐标;
}
然后像这样使用它:
[DataContract]
public class geometry<T> where T : struct
{
[DataMember]
public T coordinates;
}
var geom = new geometry<float>();
geom.coordinates = 1.0f;
[DataContract]
public class geometry<T> where T : struct
{
[DataMember]
public readonly string type = typeof(T).Name;
[DataMember]
public T coordinates;
}
var geom = new geometry<float>();
Console.WriteLine(geom.type); // Single
var geom=新几何体();
几何坐标=1.0f;
如果您确实希望将类型成员放在那里(例如,出于序列化目的),则可以使用如下内容:
[DataContract]
public class geometry<T> where T : struct
{
[DataMember]
public T coordinates;
}
var geom = new geometry<float>();
geom.coordinates = 1.0f;
[DataContract]
public class geometry<T> where T : struct
{
[DataMember]
public readonly string type = typeof(T).Name;
[DataMember]
public T coordinates;
}
var geom = new geometry<float>();
Console.WriteLine(geom.type); // Single
[DataContract]
公共类几何体,其中T:struct
{
[数据成员]
公共只读字符串类型=typeof(T).Name;
[数据成员]
公共T坐标;
}
var geom=新几何体();
Console.WriteLine(几何类型);//单身
您始终可以选择使用动态
或对象
作为类型,尽管我希望有更好的选择。我将给出一个我认为更好的使用泛型的示例。如果您使用WCF,那么将其添加为标记,大多数优秀的.net设计不适用于WCF,因此您需要WCF专家提供答案。请注意,由于您使用这些作为数据协定定义,在关闭泛型的情况下无法序列化泛型实例。e、 例如,不能让操作契约包含返回几何体的方法或将其作为参数接受的方法。但是,您可以让服务方法返回和/或接收几何体
或几何体
,等等@PrestonGuillot这是一个很好的观点。我从未尝试过,但我一直想知道,KnownType
属性是否能够绕过这个限制?