我有一个很大的A级,有很多成员,我有一个很大的B级,可以在拥有一个A对象时构建.具有B对象时可以构建A对象.我需要它们两个,因为A是一种ViewModel,它有验证,B是图形描述,可以很容易地绘制.
怎么做这个转换?
这是一个例子,来说明我想做的事情:
class A
{
string s;
string t;
string u;
string v;
enum a;
enum b;
enum c;
enum d;
enum e;
Dictionary<enum, string> dict;
}
class B
{
string someString; // is essentially A.a + A.b + A.c + A.s with some rules.
int someValue; // is essentially dict.TryGetValue(enum.Entry);
string anotherString;
// ... and lots of others
}
Run Code Online (Sandbox Code Playgroud)
当然,做一些映射很简单,并且构建一个B对象,通过反转构建A => B的规则来编写普通的B => A映射并不是很难.
所以问题是:
写下类似的东西似乎不合适,最终会产生数百行代码.
我想到了某些部件的转换器类,比如SomeStringConverter,SomeValueConverter,......
编辑: 这里的模式是"最佳实践",而不是"GoF设计模式"
B类中的SomeString是某种"选择器",它选择绘图选项,它总是25个字符长,A类中的枚举选择那些字符,但在大多数情况下不是1对1. …
午休时我们开始讨论double价值类型的精确度.
我的同事认为,小数点后总是有15位.
在我看来,人们无法分辨,因为IEEE 754没有对此做出假设,它取决于第一个1在二进制表示中的位置.(即小数点前的数字大小也计算在内)
怎么能做出更合格的陈述?
为了简单的模块间通信,存在经典.NET事件,但现在有太多事件,并且存在通过模块相互调用的事件链.
就像Event_A触发Event_B时触发Event_C.
这EventAggregator对于一个模块中的解耦通信非常方便,所以我尝试了一个小的"Jon Skeet Singleton IV" EventAggregator来打破这些event链.关于C#单身人士的Jon Skeet可以在这里找到
他告诉它是线程安全的,但他的例子只是暴露了一个Singleton资源.
这是我的代码
public static class GlobalEventAggregator
{
private static readonly IEventAggregator EventAggregator = new EventAggregator();
// tell C# compiler not to mark type as beforefieldinit
static GlobalEventAggregator()
{
}
public static void Subscribe(object instance)
{
EventAggregator.Subscribe(instance);
}
public static void Unsubscribe(object instance)
{
EventAggregator.Unsubscribe(instance);
}
public static void Publish(object message)
{
EventAggregator.Publish(message);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我可以GlobalEventAggregator在每个模块中使用它来发布事件,并且对这些事件感兴趣的每个其他模块都可以愉快地处理它们.没有更多的链接.
但是我会遇到多线程问题吗? …
我想为一个简单的项目构建一个生产者和消费者的通用系统.
我现在拥有的是什么
public interface IMessage { }
public interface Message1 : IMessage { }
public interface Message2 : IMessage { }
public interface IConsumer<T> { }
public interface IProducer<T> { }
public class Mop1 : IConsumer<Message1>, IProducer<Message2>
{
}
class Program
{
static void Main(string[] args)
{
var list = new List<IConsumer<IMessage>>();
var mop = new Mop1();
list.Add(mop); // Error occurs here
}
}
Run Code Online (Sandbox Code Playgroud)
最后一行给出了一个错误 cannot convert from 'Mop1' to 'IConsumer<GenericPubSub.IMessage>'
但是Mop1实现了IMessage派生类型的IConsumer.这是一些差异问题吗?这有什么问题?
我无法找到有关如何在现代 C++ 中在编译时组合两个或多个数组的答案。
#include <array>
#include <cstdint>
const std::array<std::uint8_t, 1> one_elem = {1};
const std::array<std::uint8_t, 2> two_elem = {2, 3};
const std::array<std::uint8_t, 3> all = {one_elem, two_elem};
// expected: all == {1, 2, 3}
Run Code Online (Sandbox Code Playgroud)
我会很高兴任何易于阅读的东西,例如
std::uint8_t one_elem[] = {1};
std::uint8_t two_elem[] = {2, 3};
std::uint8_t all[] = {one_elem, two_elem}; // cannot be that hard
Run Code Online (Sandbox Code Playgroud)
有办法吗?我能做些什么来解决这个问题?
可能重复:
定义构造函数签名的接口?
我有类和接口的混合层次结构.
为了使用序列化,我需要在每个类中存在一个默认构造函数.如果编译器可以告诉我在层次结构中某处缺少默认构造函数,我真的很感激.(在编译时看到问题,而不是在后面的测试中)
我想要的可能是一些标记或属性,但我找不到任何东西.
就像是:
[ForceDefaultConstructor]
interface IVeryQuickSerializable
{
Serialize();
Deserialize();
}
Run Code Online (Sandbox Code Playgroud)
会很好!
但是非常感谢.
有一个限制:我无法更改序列化.使它成为通用可以解决问题,但我没有源.编写包装器可能会完成这项工作,但是它会为从顶层序列化接口派生的对象(可能不会更改)带来漏洞.
对于密码加密,我想使用ProtectedData。
据我了解,这是的包装CryptProtectData。
MSDN仅声明基于用户凭据的加密含糊之处,并且如果用户没有漫游配置文件,则解密通常必须在同一台计算机上完成。
它使用哪种加密算法?
是否有分析指出这种加密是否适合密码存储?
还应该如何实现本地密码存储?
在一个项目中,我有一个外部枚举(从服务引用生成)。所以我不能改变枚举值。
如何以有效的方式将这些枚举值相互比较?
这里是一个枚举的例子
public enum Values
{
A,
B,
C,
D,
E,
F,
G,
H
}
Run Code Online (Sandbox Code Playgroud)
我想要它们的排序顺序不一样(比如 F、H、A、C、B ……)
现在我有一个带有一些比较的扩展方法。(有另一个枚举我想要的顺序)
public static int CompareTo(this Values x, Values y)
{
var orderedX = GetOrderedValues(x);
var orderedY = GetOrderedValues(y);
return orderedX.CompareTo(orderedY);
}
internal enum ValuesOrdered
{
F = 0,
H = 1,
C = 2,
D = 3,
B = 4,
A = 5,
E = 6,
G = 7
}
internal static ValuesOrdered GetOrderedValues(this Values x)
{
switch (x)
{
case …Run Code Online (Sandbox Code Playgroud) 目前我正在学习更多关于caliburn.micro的内容,这真是令人惊叹.
在我的小型演示项目中,有一些导航,有MEF和EventAggregator.
由于我想在一个已经使用统一的项目中使用caliburn.micro,我想使用Unity进行DI.
如何设置引导程序以使用Unity?
除了MindScape教程和codeplex页面上的任何好的教程都非常受欢迎.(除了我没有看到处理这种情况的合适的人)
对于我Stopwatch用于性能测量的一些私人项目.
但是在我想测量的低重复数量的呼叫计数中,我最终得到0 ElapsedMilliseconds,这使得计算平均值变得困难.
我想过写自己的秒表课程.这可能与蜱计算,并给予一个模糊的ElapsedMicroseconds基础上Stopwatch.ElapsedTicks和TimeSpan.TicksPerMillisecond.这可能不是一个很好的方法.
我肯定需要一些由winapi的高性能计数器支持的东西,所以datetime等等是不够的.
还有其他想法吗?
c# ×9
architecture ×1
arrays ×1
c++ ×1
c++14 ×1
comparison ×1
constraints ×1
constructor ×1
converter ×1
double ×1
dpapi ×1
encryption ×1
enums ×1
events ×1
generics ×1
ieee-754 ×1
interface ×1
mapping ×1
passwords ×1
sorting ×1
stopwatch ×1
variance ×1
wpf ×1