我正试图刷新我的记忆但无法找到谷歌的答案.
public class BaseClass
{
public virtual void DoSomething()
{
Trace.Write("base class");
}
}
public class DerivedClass : BaseClass
{
public override void DoSomething()
{
Trace.Write("derived class");
}
}
Run Code Online (Sandbox Code Playgroud)
如果我创建一个派生类的实例,我该如何将它转换为它的基类,这样当调用DoSomething()时,它只使用基类的方法?
动态转换仍然会调用派生类的重写方法:
DerivedClass dc = new DerivedClass();
dc.DoSomething();
(dc as BaseClass).DoSomething();
Run Code Online (Sandbox Code Playgroud)
输出:"派生类"
我想为一个练习做一个简单的应用程序,所以连接到像Access这样的简单数据库(.accdb)会很不错
我的程序看起来像这样:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Linq;
using System.Web;
namespace myProject.Account
{
public class DbManager
{
private OleDbConnection _dbConnection;
public void OpenDbConnection()
{
_dbConnection = new OleDbConnection {ConnectionString = GetConnectionString()};
}
private string GetConnectionString()
{
return "Provider=Microsoft.ACE.OLEDB.14.0;Data Source=exercise1.accdb";
}
public void CloseDbConnection()
{
_dbConnection.Close();
}
public void GetUser()
{
DataSet myDataSet = new DataSet();
var myAdapptor = new OleDbDataAdapter();
OleDbCommand command = new OleDbCommand("SELECT * FROM tblUser", _dbConnection);
myAdapptor.SelectCommand = command;
myAdapptor.Fill(myDataSet, "tblUser");
}
} …Run Code Online (Sandbox Code Playgroud) 我正在ASP.NET MVC中开发一个网站,使用最新的IE和Chrome进行测试.它看起来很好,但在IE 6/7等旧版浏览器上有一些怪癖.可悲的是,客户群是农村的,我看到有些人在他们的系统上运行IE 6和7,这个网站看起来并不像是什么.
安装不同的版本并将地址复制粘贴10-15次是很痛苦的.我已经拥有(所有最新的)Opera,Firefox,IE和Chrome.所以,我正在寻找模拟旧浏览器.
有什么办法,我可以模仿浏览器的不同版本,特别是IE和Firefox.
我现在开始使用Rails,我在论坛中查看,但我找不到任何可以解决我问题的方法.
在这里,我有一个分类表,它只有一个列的名称(类别中没有重复)所以我希望名称是主键,然后我有一个名称,main_photo,描述的产品表我想说一个产品只有一个类别,我是否需要在产品中添加一个名为category的列作为外键?
一个类别被认为有很多产品.
然后在类别模型中我如何说名称是主键,我如何在产品类别和类别中的主要名称之间进行对应?
所以我的问题是关于日志记录,以及如何处理可能影响代码和运行时行为的日志语句.
日志文件......每个程序都应该编写那些用于解决问题的问题,但是如何做到这一点?
大多数日志语句都非常昂贵,因为它们应该提供有用的信息,并且即使完全禁用日志记录也始终构建它们.
日志记录可以通过xmls,inCode或某些设置等进行配置,但这并不能解决字符串构建问题.
例如,以下代码总是加载一个巨大的延迟加载树,在正常执行期间永远不会加载.
仅为此日志记录语句创建整个树以显示在日志文件中
(好吧,我知道......,但这只是大多数程序中存在的所有复杂日志记录方法的替代,这些方法在正常发布执行期间永远不应该执行)
public void SomeMethod(){
logger.Debug(someObject.GetHeavyDescriptionFromLazyTree());
}
Run Code Online (Sandbox Code Playgroud)
someObject.GetHeavyDescriptionFromLazyTree()即使关闭日志记录,也始终会调用Method ,因此对于此问题有一些常见的解决方案,例如:
public void SomeMethod(){
#if DEBUG
logger.Debug(someObject.GetHeavyDescriptionFromLazyTree());
#endif
}
public void SomeMethod(){
if(logger.DoLogDebug())
logger.Debug(someObject.GetHeavyDescriptionFromLazyTree());
}
Run Code Online (Sandbox Code Playgroud)
我认为很明显#if DEBUG编译器标志不是生产代码的解决方案.如果我使用它logger.DoLogDebug(),将会有过多的代码来检查日志是否已启用...所以这也不是解决方案.
我认为ConditionalAttribute可以帮助,但它也绑定到编译器标志,它不会停用调用GetHeavyDescriptionFromLazyTree
[Conditional("DEBUG")]
public void Debug(string debugMessage)
{
Console.WriteLine(debugMessage);
}
Run Code Online (Sandbox Code Playgroud)
所以我正在寻找一种日志解决方案
最佳答案的额外日志;-)
编辑:我正在寻找.NET 2.0的解决方案
如何在包含图像"A"的图像"B"上找到图像"A"坐标.
我写的这个程序只检查像素值,有谁知道有没有任何库工具这样做.
你如何设置PrintDocument.PrinterSettings.PrinterName为默认打印机?
我不是在谈论在操作系统中设置默认打印机.相反,我说的是设置PrintDocument对象,以便它打印到默认打印机.
我有一个relativley简单的应用程序,它将数据保存到位于文档文件夹中的plist文件中.数据在启动时加载到UITableView中.然后,用户可以编辑,删除或添加记录,任何更改都会保存回plist文件.
现在我想使用iCloud跨设备共享此数据(plist文件).我查看了文档,我的理解是我需要创建一个UIDocument来"管理"plist文件.
我查看了几个iCloud教程,但是它们都在UIDocument类的属性中存储了一个简单的字符串,而不是整个文件(如plist).
如何使用UIDocument对象将我的plist文件(或任何其他文件)与iCloud共享?
我会将plist文件内容转换为NSData,然后将其保存在UIDocument中的属性中吗?我应该使用NsFileWrapper吗?
我似乎很难绕着UIDocument/iCloud安排我的脑袋.我可能会让它变得更加复杂.
我正在考虑使用C#的能力来按需编译代码作为脚本语言的基础.我想知道,我怎么能沙箱我正在执行的脚本,以便他们无法访问文件系统,网络等.基本上,我想要对正在运行的脚本的限制权限.
我采取的步骤:
CompilerResults r = CSharpCodeProvider.CompileAssemblyFromSource(source);
Assembly a = r.CompiledAssembly;
IScript s = a.CreateInstance(...);
s.EntryPoint(...);
Run Code Online (Sandbox Code Playgroud) 我做了一个扩展方法来查找集合中连续值的数量.因为它是通用的,所以我允许调用者定义"incrementor",它是一个Func <>,它应该增加值以检查是否存在"next"值.
但是,如果调用者传递了一个不正确的递增器(即x => x),它将导致无限递归循环.有什么建议干净的方法来防止这种情况?
public static int CountConsecutive<T>(this IEnumerable<T> values, T startValue, Func<T, T> incrementor)
{
if (values == null)
{
throw new ArgumentNullException("values");
}
if (incrementor == null)
{
throw new ArgumentNullException("incrementor");
}
var nextValue = incrementor(startValue);
return values.Contains(nextValue)
? values.CountConsecutive(nextValue, incrementor) + 1
: 1;
}
Run Code Online (Sandbox Code Playgroud)