Tag: 设计

通用TryParse扩展方法

代码取自这里 我想听听一些关于这种扩展方法的专家意见。 我打算使用它,但想知道我可能遇到的任何已知问题。 我更喜欢在主要类型上使用TryParse方法吗? public static T? TryParse(this object obj) where T : struct { if (obj == null) return null; T? result = null; TypeConverter converter = TypeDescriptor.GetConverter(typeof(T)); if (converter != null) { try { string str = obj.ToString(); result = (T)converter.ConvertFromString(str); } catch (Exception ex) { throw ex; } } return result; }

键入Casting和Factory模式

我正在努力弄清楚如何在我试图创建的DTO映射器中实现工厂模式。 我很确定我需要重新考虑我的设计。 这是我正在运行的一个非常小的例子: public abstract class Person { public string Name { get; set; } public decimal Salary { get; set; } } public class Employee : Person { public Employee() { this.Salary = 20000; } } public class Pilot : Person { public string PilotNumber { get; set; } public Pilot() { this.Salary = […]

在C#中表示游戏卡类的最佳方式

我使用类卡,其中包含2个枚举属性(套件 – 心形钻石黑桃和俱乐部)和卡值从2到A.并覆盖ToString()方法返回类似Ah Ad等等。一切正常但枚举值无法启动有了数字,因此枚举的卡片值看起来像x2,x3,x4 ……它不漂亮。 还需要简单的方法来解析单个字符串中的几张卡片。 谁知道设计这门课程的最佳方法?

WCF – 设计参数决策

我正在为FundManagement设计服务。 FundManagement Service有一个名为“UpdateFundApprovalDate(FundDTO fund)”的操作。 此操作将使用fundingID的批准日期更新资金表记录。 该服务将由“FundManagementUI”客户端使用。 如果合同续订正在进行,则有一项业务规则,即不应更新批准日期。 有一个单独的续订服务。 续订服务使用续订表中的数据(其中包含资金ID)。 更新表的结构是(RenewalID,FundingID,RenewalStartDate,Renewal CompletionDate,RenewalStatus)。 有一个名为“public List GetInProgressRenewal(FundDTO fund)”的服务操作。 一点很重要。 虽然两个服务都使用相同的数据库,但“续进”续订应由续订服务决定。 它可以基于续订记录的状态或完成日期。 续订服务决定“进行中”续订的业务逻辑。 FundManagement Service声称没有对该逻辑的所有权。 什么是解释上述行为的SOA原则/模式? (使用续订服务确定“进行中”续订,但续订服务可能会根据自身利益更改逻辑。)。 有关此类情景的指导原则是什么? 对于任何涉及此类设计决定的文章,您有什么建议吗? 在FundManagement Service内部,谁应该负责validation返回的续订列表是否为NULL? 这种validation应该在服务操作方法代码内部还是在FundBusinessLayer内部(服务人员调用)中进行? 注意:这里的SOA将使用WCF实现,业务classess将是使用C#开发的dll。 读: SOA / WCF剖析系统和服务边界

检查形状之间碰撞的设计模式

我使用各种形状进行碰撞检测( Rectangle , Circle , Cone , Ring等)。所有这些形状都是从基础抽象Shape类派生出来的。 我的游戏对象具有Shape类型的属性。 class GameObject { (…) public Shape CollisionShape { get; set; } } 在初始化过程中,我决定将为每个对象使用什么形状,例如: GameObject person = new GameObject(); person.CollisionShape = new Circle(100); // 100 is radius 现在,当我想检查两个对象是否相交时,我使用以下类: public class IntersectionChecker { public bool Intersect(Shape a, Shape b) { Type aType = a.GetType(); Type bType = b.GetType(); […]

C#方法中有多少参数可以接受?

我是C#的新手,必须维护一个C#应用程序。 现在我发现了一个具有32个参数(不是自动生成的代码)的方法。 从C / C ++我记得经验法则“4参数”。 它可能是一个老式的规则,它回溯到旧的0x86编译器,其中4个参数可以容纳在寄存器中(快速)或者在堆栈中。 我并不关心性能,但我确实感觉即使在C#中,每个function的32个参数也不容易维护。 或者我完全不是最新的? C#的经验法则是什么? 谢谢你的提示!

关于使用RFID进行C#线程的问题

我的问题是关于确保我采取正确方法并正确处理线程的反馈。 我有一种感觉,我可能需要设置一些自己的线程,所以欢迎所有反馈。 我遇到的问题是从零个或多个RFID阅读器读取RFID标签。 我可以在没有问题的情况下阅读单个读者,因此从几个读取不会是一个问题。 读者阅读的每个标签或批次标签都由.Net事件提供。 我的计划是设置一个ReaderControl类,它维护读者,连接,启动,停止等。这个类将听取读者的TagRead事件。 它处理的每个事件(大约每250毫秒)它将读取标记ID(一个字符串)放入一个HashSet以保持它们的唯一性,HashSet位于ReaderControl中。 ReaderControl将包含一个计时器,每500ms触发一次,这个TimerElapsed事件由ReaderControl处理,它将打包从目前为止从所有读取器读取的标签并引发TagsRead事件。 这样做的目的是将事件触发保持在最低限度并减少重复标记。 TagsReads事件由另一个名为TagTranslator的类处理。 这个类将遍历标记ids(字符串)并计算出标记引用的内容,即IPerson对象。 此课程将在完成翻译时使用PeopleSeen事件触发事件。 PeopleSeen事件由GUI中的模型(MVP模式)处理。 总体思路是GUI显示屏显示通过RFID阅读器的人的名字。 显示器很简单,但显然在引擎盖标签正在asych中读取并被转换为“真实”对象以进行显示。 你认为ReaderControl应该在自己的线程上运行,我认为它应该。 我如何在自己的线程中打包这个类,无论GUI在做什么,都只是继续阅读标签。 另外,您认为TagTranslator在处理事件时应该创建线程来处理翻译。

Windows窗体应用程序中的Dock,Anchor和Fluid布局

所以,我被要求重新设计几年前我写的旧应用程序。 基本上,没有什么需要改变,除了客户希望它更流畅,并且它必须是全屏的(没有可见的“窗口”)即没有Titlebar,只是一个无边框全屏窗口。 什么是确保一切都保持流畅的最佳方法,我的意思是我们如何确保一切都出现在它应该的位置,因为你知道,不同的分辨率,显示器尺寸等? 这在网页/ CSS中很容易,但这不是我以前做过的。 大多数控件将在运行时以编程方式创建,具体取决于执行的操作等。我将如何完成这样的布局? 基本上我希望能够全屏显示,不知道他们的显示器有多大,或者他们使用的是什么分辨率。

接口的意义C#

我想知道Interface的重要用途。 我已经阅读了很多文章,但没有清楚地了解界面的概念。 我写了一个小程序。 我已经定义了接口Itest.Class(Manager)已经实现了Interface.Another class(Employee)还没有实现接口。 但是在类( Employee )的接口中定义了相同的方法( DoSomething() )。 我可以从类对象中调用该方法。 那我为什么要去实现接口呢? 我可以在类中直接实现该方法并调用该方法。 为什么我要在接口中执行额外的步骤,然后按类inheritance接口。 我知道接口支持多重inheritance,但在这个例子中我没有使用多重inheritance。 感谢您的任何想法或意见。 public interface Itest { void DoSomething(); } public class Manager:Itest { public void DoSomething() { Console.WriteLine(“test….”); } } class Employee { public void DoSomething() { Console.WriteLine(“test….”); } } class Program { static void Main(string[] args) { Manager m = […]

关系的数据结构

我正在将VB6转换为C#,我希望使我的数据结构更有效地保持值和关系。 在VB中,我有一组值和另一组关系,这些值与这些关系的优先级相关。 我还有一个算法,当一组值传递给它时,返回将这些值连接在一起所需的所有关系。 例如,假设值集合包含1-10并且关系集合包含 1,2 3,2 5,2 2,8 8,10 9,10 如果输入是1,9,10,则返回的关系将是 – 1,2 2,8 8,10 9,10 由于可能存在多条路径,因此会返回最少量的关系,但需要注意关系优先级。 如果关系具有更高的优先级,则将添加该关系,并且将从那里添加其余关系。 我正在考虑使用Disjoint-set数据结构,但我不确定。 有任何想法吗? 更多信息 – 值的数量通常小于100且关系小于500.集合是静态的,并且将一次又一次地使用算法来查找路径。 另外,我没有问这个问题,但是Disjoint-set数据结构中的算法是否最有效?