我的问题是,以最可维护的方式将一个对象映射到另一个对象的最佳方法是什么.我无法改变我们获得的Dto对象设置为更规范化的方式,因此我需要创建一种方法将其映射到我们对象的实现.
以下示例代码显示了我需要发生的事情:
class Program
{
static void Main(string[] args)
{
var dto = new Dto();
dto.Items = new object[] { 1.00m, true, "Three" };
dto.ItemsNames = new[] { "One", "Two", "Three" };
var model = GetModel(dto);
Console.WriteLine("One: {0}", model.One);
Console.WriteLine("Two: {0}", model.Two);
Console.WriteLine("Three: {0}", model.Three);
Console.ReadLine();
}
private static Model GetModel(Dto dto)
{
var result = new Model();
result.One = Convert.ToDecimal(dto.Items[Array.IndexOf(dto.ItemsNames, "One")]);
result.Two = Convert.ToBoolean(dto.Items[Array.IndexOf(dto.ItemsNames, "Two")]);
result.Three = dto.Items[Array.IndexOf(dto.ItemsNames, "Three")].ToString();
return result;
}
}
class Dto
{
public object[] Items …Run Code Online (Sandbox Code Playgroud) 我试图将XML文件反序列化为几个类对象:艺术家,专辑和歌曲
这是当前的设置:
static void Main(string[] args)
{
var riseAgainst = DeSerializer(CreateElement());
Console.WriteLine(string.Format("Band: {0}",riseAgainst.Name));
Console.WriteLine("-----------------------------");
Console.WriteLine(string.Format("Album: {0}",riseAgainst.Album.Name));
Console.WriteLine("-----------------------------");
Console.WriteLine("Song List:\r");
foreach(var s in riseAgainst.Album.Songs)
{
Console.WriteLine(string.Format("Song: {0}", s));
}
Console.ReadLine();
}
static XElement CreateElement()
{
return new XElement("Artist",
new XElement("Name", "Rise Against"),
new XElement("Album",
new XElement("Name", "Appeal to Reason"),
new XElement("Songs",
new XElement("Song", "Hero of War"),
new XElement("Song", "Savior"))
)
);
}
static Artist DeSerializer(XElement element)
{
var serializer = new XmlSerializer(typeof(Artist));
return (Artist)serializer.Deserialize(element.CreateReader());
}
}
public class Artist
{
public …Run Code Online (Sandbox Code Playgroud) 我有以下代码示例
if(object.Time > 0 && <= 499)
{
rate = .75m
}
else if(object.Time >= 500 && <= 999)
{
rate = .85m
}
else if(object.Time >= 1000)
{
rate = 1.00m
}
else
{
rate = 0m;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我可以用什么设计模式来改善它?
编辑:为了更清楚地说明,您在此处看到的代码是战略模式实施中当前存在的内容.我们有3种类型的计算,其中2种具有3种不同的"费率",可以根据您在下面看到的时间使用.我考虑过为每个速率创建一个策略实现,但后来我会移动逻辑来确定使用的策略并使其变得混乱.
谢谢!
c# refactoring design-patterns if-statement solid-principles
我正在创建一个应用程序(Windows窗体),允许用户根据他们选择的位置截取屏幕截图(拖动到选择区域).我想添加一个放大的"预览窗格",以便用户可以更精确地选择他们想要的区域(更大的像素).在mousemove事件中我有以下代码...
private void falseDesktop_MouseMove(object sender, MouseEventArgs e)
{
zoomBox.Image = showZoomBox(e.Location);
zoomBox.Invalidate();
bmpCrop.Dispose();
}
private Image showZoomBox(Point curLocation)
{
Point start = new Point(curLocation.X - 50, curLocation.Y - 50);
Size size = new Size(100, 90);
Rectangle rect = new Rectangle(start, size);
Image selection = cropImage(falseDesktop.Image, rect);
return selection;
}
private static Bitmap bmpCrop;
private static Image cropImage(Image img, Rectangle cropArea)
{
if (cropArea.Width != 0 && cropArea.Height != 0)
{
Bitmap bmpImage = new Bitmap(img);
bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat);
bmpImage.Dispose(); …Run Code Online (Sandbox Code Playgroud) 有没有什么方法可以实际使用cookie容器中的cookie(以前从WebRequest中获取)并在WebBrowser控件中使用它们?如果是这样,我该怎么做?这适用于C#中的Winforms应用程序.
我有一个winforms应用程序,我一直在努力对消费者帐户进行多项测试.测试需要一次登录才能执行.
string paramaters = "authmethod=on&chkRememberMe=on&login-form-type=pwd&password=" + pw.Text + "&userid=" + uid.Text + "&username=" + uid.Text;
string strResponse;
HttpWebRequest requestLogin = (HttpWebRequest)WebRequest.Create("https://www.url.com/login.form");
requestLogin.Method = "POST";
requestLogin.CookieContainer = cookieJar;
requestLogin.ContentType = "application/x-www-form-urlencoded";
requestLogin.ContentLength = paramaters.Length;
StreamWriter stOut = new StreamWriter(requestLogin.GetRequestStream(), System.Text.Encoding.ASCII);
stOut.Write(paramaters);
stOut.Close();
StreamReader stIn = new StreamReader(requestLogin.GetResponse().GetResponseStream());
strResponse = stIn.ReadToEnd();
stIn.Close();
Run Code Online (Sandbox Code Playgroud)
这个脚本适用于登录就好了,问题是当我需要实际运行测试时我需要将所有结果都返回到一个字符串中(HTML结果).
private string runTestRequest(Uri url, string parameters)
{
string testResults = string.Empty;
HttpWebRequest runTest = (HttpWebRequest)WebRequest.Create(url);
runTest.CookieContainer = cookieJar;
runTest.Method = "POST";
runTest.ContentType = "application/x-www-form-urlencoded";
StreamWriter stOut = new StreamWriter(runTest.GetRequestStream(), …Run Code Online (Sandbox Code Playgroud) 我有一个Winforms应用程序,用户可以使用它来获取基于区域的屏幕截图.我想要一个小预览窗格,但我不知道该怎么做.到目前为止,我尝试在鼠标移动时重新创建一个位图,它的方式太迟了,无法使用.所以我想如果我使用预定义的图像(整个屏幕的屏幕截图)并根据鼠标位置将其移动到图片框中,以便您放大屏幕的外观(选择您想要的精确像素)截图更简单).我不确定我是如何实现这一点的,我也很新画,所以我会告诉你我现在拥有的东西.
private void falseDesktop_MouseMove(object sender, MouseEventArgs e)
{
zoomBox.Image = showZoomBox(e.Location);
zoomBox.Invalidate();
}
private Image showZoomBox(Point curLocation)
{
int x = 0;
int y = 0;
if (curLocation.X - 12 <= 0)
{
x = curLocation.X - 12;
}
else
{
x = curLocation.X;
}
if (curLocation.Y - 11 <= 0)
{
y = curLocation.Y - 11;
}
else
{
y = curLocation.Y;
}
Point start = new Point(curLocation.X - 12, curLocation.Y - 11);
Size size = new Size(24, 22); …Run Code Online (Sandbox Code Playgroud) 是否可以在Java中执行以下C#代码?
Process.Start("c:/test.exe", "filearg1,filearg2,filearg3");
Run Code Online (Sandbox Code Playgroud) 这是winforms.我正在创建一个用户控件,它基本上是一个充满其他用户控件的FlowlayoutControl.我需要添加的每个控件都停靠在前一个控件的顶部(从左到右).不幸的是,看起来flowlayoutcontrol忽略了任何对接属性.有没有办法将控制器停靠在那里?我需要它从左到右填充项目,但项目应该像列表视图一样布局.真的没有我可以提供的代码,因为它是一个确定采取什么方法的事实.
这是在C#中
我基本上需要从textbox.Text制作TabPages,例如:
textBox1.Text = "test";
TabPage textBox1.Text = new TabPage();
Run Code Online (Sandbox Code Playgroud)
那就是我想做的..我知道那将无法直接工作,但这应该使您了解如何创建tabPages ..然后,我希望以后也能够调用它们,例如:
String browser = "browser 1";
(textBox1.Text as TabPage).Controls.Add(WebBrowser browser)
Run Code Online (Sandbox Code Playgroud)
我需要所有名称都是动态的,因为这将是一个可以为客户帐户运行测试的程序。将有一个TabControl,其中的“帐户号为tabPage控件名称,然后在每个tabPages内部是另一个TabControl在每个选项卡中都有设置选项卡,每个个体化测试都在其自己的选项卡中。
我正在尝试从C#/ Winforms访问Outlook邮箱.我有两个单独的邮箱,我的用户配置文件可以访问.我如何编码它,以便它只从某个邮箱拉?
这是我目前所拥有的,但它只从我的默认帐户邮箱中提取信息.
try
{
OutLook.Application oApp = new OutLook.Application();
OutLook.NameSpace oNS = (OutLook.NameSpace)oApp.GetNamespace("MAPI");
oNS.Logon(Missing.Value, Missing.Value, false, true);
OutLook.MAPIFolder theInbox = oNS.GetDefaultFolder(OutLook.OlDefaultFolders.olFolderInbox);
int count = theInbox.UnReadItemCount;
inboxLabel.Text = inboxLabel.Text + " " + count.ToString();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
Run Code Online (Sandbox Code Playgroud)
我还需要告诉它某些文件夹以及收件箱(如上所述).
感谢您的帮助.
我在C#/ Winforms中有一个应用程序,主要用于在特定的订单/设置中为客户帐户运行测试.它们都是在浏览器中运行的测试,因此我构建它以便自动化该过程,因为每次提取客户帐户时都需要运行大约10-12个测试.
基本上会发生什么是您输入帐号然后它运行测试.
这是一个示例代码.
public void startTestProcess()
{
if (!cancelTests)
{
testRunning = true;
var tabPage = createTabPage(banToRun, Convert.ToInt32(banToRun));
loadingBox.Visible = true;
mainTabControl.TabPages.Insert(0, tabPage);
mainTabControl.SelectedTab = mainTabControl.TabPages[0];
runTest(tabPage, banToRun);
loadingBox.Visible = false;
}
}
private void runTest(TabPage t, string ban)
{
if (!cancelTests && !cancelCurrentOnly)
{
var tC = createInitialTabControl();
t.Controls.Add(tC);
int[] theTests = profileInfo.getSetList;
for (int i = 0; i < theTests.Length; i++)
{
if (!cancelTests && !cancelCurrentOnly)
{
var newTab = createTabPage(urlStrings.getName(theTests[i]), theTests[i]);
tC.TabPages.Add(newTab);
var webBrowser = createBrowser(urlStrings.getUrl(theTests[i], …Run Code Online (Sandbox Code Playgroud) 我有一个对象数组,我正在返回以不同的方法使用对象,但由于某种原因,它说"并非所有代码路径返回值"
这是代码....
private object[] runTests(string banText, object tabControlName, int runThisTest, string testName)
{
if (stopTests == false)
{
var tabPageBrowser = new TabPage();
var Browser = new WebBrowser();
(tabControlName as TabControl).TabPages.Add(tabPageBrowser);
tabPageBrowser.Name = tabControlName.ToString();
tabPageBrowser.Text = testName;
tabPageBrowser.Font = new System.Drawing.Font("Trebuchet MS", 8.25F,
System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
Browser.Dock = DockStyle.Fill;
Browser.Url = new Uri(testStrings(runThisTest, banText));
Browser.Name = tabControlName.ToString();
Browser.ScriptErrorsSuppressed = true;
tabPageBrowser.Controls.Add(Browser);
try
{
while (Browser.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
}
}
catch
{
return null;
}
IntPtr pHandle = GetCurrentProcess(); …Run Code Online (Sandbox Code Playgroud)