首页 / C# / c# – 类型<> /无类型设计
c# – 类型<> /无类型设计
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 类型<> /无类型设计,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2715字,纯文字阅读大概需要4分钟。
内容图文
![c# – 类型<> /无类型设计](/upload/InfoBanner/zyjiaocheng/814/ef6242c556c94cdbb82a790fcfc86a11.jpg)
我有一个(现有的)类型的项目:
Items<T>
T Value { get; }
T可以是double,string或int.
然后我有一个类,必须持有几个Items实例.在这个类的单个实例中,T始终是相同的.实际上,实际包含的类型由属性确定,而容器未键入:
Data
DataType { get; set; }
Items<double>
double Value;
Items<string>
// ... and so on. Nasty stuff.
理想情况下,这当然是
Data<T>
Items<T>
T value
数据实例是从头开始在代码中创建的,可以从数据库加载.当然,工厂将在我们的未来,但Create方法的返回类型是什么?
更糟糕的是,我需要这个:
DataCollection
// HERE'S THE PAIN: What's the type here?
List of Data<> instances with differing types
foreach (? data in someDataCollection)
if (thetypeof data is double)
doSomething();
else
doSomethingElse();
现在,我可以解决这个问题,但我看不出一个清洁的方法来解决这个问题.
我的第一个问题是DataCollection的声明.列表的类型是什么?列出< object>,因此它可以保存Data< double>和数据< string>?
解决方法:
实际上有一种干净的方法来解决这个问题;您可以使用具有数据类型的键的字典和具有通用类型Func<>类型的值. .然后将类型传递给create方法,然后查找Func<>根据类型在Dictionary中使用,并调用Func<>创建或处理您的对象.
由于我使用伪代码,基本上它看起来像下面的东西;你可以玩它并修改它以满足你的需求,但这是基本的想法.
首先,为所有数据对象创建父类;请注意,此类有一个查找字典,用于调用各种类型的函数,并注意它是抽象的:
public abstract class Data
{
// A Lookup dictionary for processing methods
// Note this the functions just return something of type object; specialize as needed
private static readonly IDictionary<Type, Func<object, Data>> _processFunctions = new Dictionary
<Type, Func<object, Data>>()
{
{typeof(int), d => { return doSomethingForInt( (Data<int>) d); }},
{typeof(string), d => { return doSomethingForString( (Data<string>) d); }},
{typeof(double), d => { return doSomethingForDouble( (Data<double>) d); }},
};
// A field indicating the subtype; this will be used for lo
private readonly Type TypeOfThis;
protected Data(Type genericType)
{
TypeOfThis = genericType;
}
public Data Process()
{
return _processFunctions[this.TypeOfThis](this);
}
}
现在使用可以实例化的泛型类型子类化Data:
class Data<T> : Data
{
// Set the type on the parent class
public Data() : base(typeof(T))
{
}
// You can convert this to a collection, etc. as needed
public T Items { get; set; }
public static Data<T> CreateData<T>()
{
return new Data<T>();
}
}
然后,您可以使用父类型创建DataCollection类.注意ProcessData()方法;它现在所做的就是遍历元素并在每个元素上调用Process():
class DataCollection
{
public IList<Data> List = new List<Data>();
public void ProcessData()
{
foreach (var d in List)
{
d.Process();
}
}
}
……而且你们都准备好了!现在,您可以使用不同类型的数据调用DataCollection:
DataCollection dc = new DataCollection();
dc.List.Add(new Data<int>());
dc.List.Add(new Data<string>());
dc.List.Add(new Data<double>());
dc.ProcessData();
内容总结
以上是互联网集市为您收集整理的c# – 类型<> /无类型设计全部内容,希望文章能够帮你解决c# – 类型<> /无类型设计所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。