我有一个类,我想用它来存储另一个类的"属性".这些属性只有名称和值.理想情况下,我想要的是能够添加类型属性,以便返回的"值"始终是我想要的类型.
类型应该始终是原始的.此类是一个抽象类的子类,它基本上将名称和值存储为字符串.这个想法是这个子类将为基类添加一些类型安全性(以及节省我的一些转换).
所以,我创建了一个类(大致)这个:
public class TypedProperty<DataType> : Property
{
public DataType TypedValue
{
get { // Having problems here! }
set { base.Value = value.ToString();}
}
}
Run Code Online (Sandbox Code Playgroud)
所以问题是:
是否有一种"通用"方式从字符串转换回原语?
我似乎找不到任何通用的界面来连接整个转换(像ITryParsable这样理想!).
我有一个方法,它采用params object [],如:
void Foo(params object[] items)
{
Console.WriteLine(items[0]);
}
Run Code Online (Sandbox Code Playgroud)
当我将两个对象数组传递给此方法时,它可以正常工作:
Foo(new object[]{ (object)"1", (object)"2" }, new object[]{ (object)"3", (object)"4" } );
// Output: System.Object[]
Run Code Online (Sandbox Code Playgroud)
但是,当我传递一个对象[]时,它不会将我的对象[]作为第一个参数,而是将所有元素视为我想要逐个传递它们:
Foo(new object[]{ (object)"1", (object)"2" });
// Output: 1, expected: System.Object[]
Run Code Online (Sandbox Code Playgroud)
如何将单个对象[]作为第一个参数传递给params数组?
因此,继续我的新年决议以获得更多TDD,我现在开始更多地使用Rhino Mocks.
我真正想要做的一件事就是确保我真正了解我所要做的事情,所以我想检查一下我对目前所看到的情况的理解(我认为最好把它放在这里作为一个资源).
继我之前的问题之后,我一直致力于将我的对象模型序列化为XML.但我现在遇到了一个问题(quelle surprise!).
我遇到的问题是我有一个集合,它是一个抽象的基类类型,由具体的派生类型填充.
我认为只需将XML属性添加到所涉及的所有类中,一切都会很好.可悲的是,事实并非如此!
所以我在谷歌上做了一些挖掘,现在我明白为什么它不起作用了.在该XmlSerializer
其实是在为了序列化对象做一些聪明的反射/通过XML,并且因为它的基础上,抽象类型,它不能弄清楚到底是怎么回事了它的交谈.精细.
我确实遇到过CodeProject 上的这个页面,它看起来好像很有帮助(还没有完全阅读/消费),但我想我也想把这个问题带到StackOverflow表中,看看你是否有任何整洁黑客/技巧,以最快/最轻的方式启动和运行.
有一件事我还要补充的是,我不要想往下走XmlInclude
的路线.与它有太多的耦合,系统的这个区域正在大量开发,所以这将是一个真正的维护头痛!
有没有办法强制/限制传递给基元的类型? (bool,int,string等)
现在,我知道您可以通过where子句将泛型类型参数限制为类型或接口实现.然而,这不符合基元(AFAIK)的费用,因为它们并非都有共同点(除了某人之前的对象!:P).
所以,我目前的想法只是咬紧牙关并做一个大的switch语句并在失败时抛出ArgumentException.
编辑1:
只是为了澄清:
代码定义应该是:
public class MyClass<GenericType> ....
Run Code Online (Sandbox Code Playgroud)
和实例化:
MyClass<bool> = new MyClass<bool>(); // Legal
MyClass<string> = new MyClass<string>(); // Legal
MyClass<DataSet> = new MyClass<DataSet>(); // Illegal
MyClass<RobsFunkyHat> = new MyClass<RobsFunkyHat>(); // Illegal (but looks awesome!)
Run Code Online (Sandbox Code Playgroud)
编辑2
@Jon Limjap - 好点,我正在考虑的事情......我确信有一个通用的方法可以用来确定类型是值还是引用类型..
这可以用于立即删除我不想处理的很多对象(但是你需要担心使用的结构,比如Size).有趣的问题不是吗?:)
这里是:
where T : struct
Run Code Online (Sandbox Code Playgroud)
取自MSDN.
我很好奇..可以使用扩展方法在.NET 3.x中完成吗?创建一个接口,并在扩展方法中实现接口(这可能比胖胖的开关更干净).此外,如果您稍后需要扩展到任何轻量级自定义类型,它们也可以实现相同的接口,而不需要对基本代码进行任何更改.
你们有什么感想?
可悲的消息是我在Framework 2中工作!! :d
编辑3
从Jon Limjaps Pointer开始,这非常简单.这么简单,我几乎想哭,但它很棒,因为代码就像一个魅力!
所以这就是我所做的(你会笑!):
bool TypeValid()
{ …
Run Code Online (Sandbox Code Playgroud) 在过去的几年里,我对CouchDB项目感兴趣,并且看到它现在是一个Apache Incubator项目.在此之前,CouchDB网站充满了不用于生产代码类型的免责声明,所以我做的只不过是关注它.如果您一直在使用CouchDB进行实时项目或技术试用,我有兴趣了解您的经验.
我最近遇到过这种情况,到目前为止,我一直在愉快地重写等于运算符(==)和/或Equals方法,以查看两个引用类型是否实际包含相同的数据(即两个看起来相同的不同实例).
我一直在使用它,因为我已经进行了更多的自动化测试(比较参考/预期数据与返回的数据).
在查看MSDN中的一些编码标准指南时,我遇到了一篇建议反对它的文章.现在我理解为什么文章说这个(因为它们不是同一个实例)但它没有回答这个问题:
非常感谢^ _ ^
看起来我错误地阅读了一些文档(这是漫长的一天)并且压倒Equals可能是要走的路.
如果要实现引用类型,则应考虑在引用类型上覆盖Equals方法(如果类型看起来像基本类型,如Point,String,BigNumber等).大多数引用类型不应重载等于运算符,即使它们重写等于.但是,如果要实现旨在具有值语义的引用类型(例如复数类型),则应覆盖相等运算符.
好吧,我知道已经有关于开始使用TDD的问题了.但是,我想我知道一般的共识就是这样做,但是,我似乎有以下问题让我的头脑进入游戏:
所以基本上我在这里寻找的不是" 只是做它 "而是" 我做了这个,有这个问题,通过这个解决了它们 ".. 个人经历:)
我终于开始讨论创建一些与RESTful Web界面一起使用的应用程序,但是,我担心每次按F5运行一系列测试时我都在锤击他们的服务器.
基本上,我需要获得一系列的Web响应,以便我可以测试我正确解析变化的响应,而不是每次都打到它们的服务器,我想我可以这样做一次,保存XML然后在本地工作.
但是,我不知道如何"模拟"WebResponse,因为(AFAIK)它们只能由WebRequest.GetResponse实例化.
你们怎么去嘲笑这种事情?你呢?我真的不喜欢我正在锤击他们的服务器的事实:SI不想过多地改变代码,但我希望有一种优雅的方式来做这件事.
Will的回答是我所需要的一记耳光,我知道我错过了一个基本点!
一旦我敲了代码,我就会粘贴一些样本.
好吧,我知道在Rhino Mocks中对新的AAA语法有很多困惑,但我必须说实话,从我到目前为止看到的,我喜欢.它读得更好,并节省了一些按键.
基本上,我正在测试一个ListController
基本上将负责一些事情列表:)我已经创建了一个最终将成为DAL的接口,这当然是存在的.
我有以下代码:
(manager
是被测系统,data
是存根数据接口)
[Fact]
public void list_count_queries_data()
{
data.Expect(x => x.ListCount(1));
manager.ListCount();
data.VerifyAllExpectations();
}
Run Code Online (Sandbox Code Playgroud)
此测试的主要目的是确保经理实际查询DAL.请注意,DAL实际上并不存在,因此没有"实际"值返回..
但是,这是失败的,因为我需要将期望值更改为具有返回值,例如:
data.Expect(x => x.ListCount(1)).Return(1);
Run Code Online (Sandbox Code Playgroud)
然后这将运行正常,测试将通过,但令我困惑的是,此时,返回值没有任何意义.我可以将它改为100,50,42,无论如何,测试总会通过?
这让我感到紧张,因为测试应该是明确的,如果不能满足预期的条件,应该完全失败吗?
如果我将测试更改为("1"是计数链接到的预期ID):
[Fact]
public void list_count_queries_data()
{
manager.ListCount();
data.AssertWasCalled(x => x.ListCount(1));
}
Run Code Online (Sandbox Code Playgroud)
这一切都很顺利,如果我将测试切换到它的头部AssertWasNotCalled
,它会按预期失败.我也认为它看起来好多了,更清楚正在测试什么,最重要的是PASSES和FAILS如预期的那样!
c# ×5
generics ×2
primitive ×2
tdd ×2
type-safety ×2
unit-testing ×2
xml ×2
.net ×1
arrays ×1
comparison ×1
couchdb ×1
database ×1
equality ×1
inheritance ×1
rest ×1
rhino-mocks ×1
stub ×1
testing ×1
web-services ×1
webrequest ×1
webresponse ×1