小编obe*_*eak的帖子

将派生类转换为基类

我正试图刷新我的记忆但无法找到谷歌的答案.

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)

输出:"派生类"

c# polymorphism

33
推荐指数
3
解决办法
6万
查看次数

OLEDB连接到Access数据库(accdb)

我想为一个练习做一个简单的应用程序,所以连接到像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)

c# asp.net oledbconnection

12
推荐指数
1
解决办法
7万
查看次数

不同版本的浏览器或浏览器模拟器

我正在ASP.NET MVC中开发一个网站,使用最新的IE和Chrome进行测试.它看起来很好,但在IE 6/7等旧版浏览器上有一些怪癖.可悲的是,客户群是农村的,我看到有些人在他们的系统上运行IE 6和7,这个网站看起来并不像是什么.

安装不同的版本并将地址复制粘贴10-15次是很痛苦的.我已经拥有(所有最新的)Opera,Firefox,IE和Chrome.所以,我正在寻找模拟旧浏览器.

有什么办法,我可以模仿浏览器的不同版本,特别是IE和Firefox.

browser cross-browser

11
推荐指数
2
解决办法
4万
查看次数

在Rails上创建表时需要创建外键吗?

我现在开始使用Rails,我在论坛中查看,但我找不到任何可以解决我问题的方法.

在这里,我有一个分类表,它只有一个列的名称(类别中没有重复)所以我希望名称是主键,然后我有一个名称,main_photo,描述的产品表我想说一个产品只有一个类别,我是否需要在产品中添加一个名为category的列作为外键?

一个类别被认为有很多产品.

然后在类别模型中我如何说名称是主键,我如何在产品类别和类别中的主要名称之间进行对应?

ruby-on-rails foreign-key-relationship scaffold

8
推荐指数
2
解决办法
1万
查看次数

记录完成正确

所以我的问题是关于日志记录,以及如何处理可能影响代码和运行时行为的日志语句.

日志文件......每个程序都应该编写那些用于解决问题的问题,但是如何做到这一点?

大多数日志语句都非常昂贵,因为它们应该提供有用的信息,并且即使完全禁用日志记录也始终构建它们.

日志记录可以通过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)

所以我正在寻找一种日志解决方案

  • 使用调试语句不会过度破坏我的源代码
  • 在运行时而不是在编译时决定日志记录级别的位置
  • 只有在必要时才解决语句(logLevel> definedLogLevel)

最佳答案的额外日志;-)

编辑:我正在寻找.NET 2.0的解决方案

c# logging log4net c#-2.0

8
推荐指数
1
解决办法
1660
查看次数

opencv查找图像在另一个图像上坐下

如何在包含图像"A"的图像"B"上找到图像"A"坐标.

我写的这个程序只检查像素值,有谁知道有没有任何库工具这样做.

opencv image point find

8
推荐指数
2
解决办法
2万
查看次数

如何设置为默认打印机

你如何设置PrintDocument.PrinterSettings.PrinterName为默认打印机?

我不是在谈论在操作系统中设置默认打印机.相反,我说的是设置PrintDocument对象,以便它打印到默认打印机.

c# printdocument

7
推荐指数
2
解决办法
2万
查看次数

使用iCloud共享plist文件

我有一个relativley简单的应用程序,它将数据保存到位于文档文件夹中的plist文件中.数据在启动时加载到UITableView中.然后,用户可以编辑,删除或添加记录,任何更改都会保存回plist文件.

现在我想使用iCloud跨设备共享此数据(plist文件).我查看了文档,我的理解是我需要创建一个UIDocument来"管理"plist文件.

我查看了几个iCloud教程,但是它们都在UIDocument类的属性中存储了一个简单的字符串,而不是整个文件(如plist).

如何使用UIDocument对象将我的plist文件(或任何其他文件)与iCloud共享?

我会将plist文件内容转换为NSData,然后将其保存在UIDocument中的属性中吗?我应该使用NsFileWrapper吗?

我似乎很难绕着UIDocument/iCloud安排我的脑袋.我可能会让它变得更加复杂.

persistence plist nsfilewrapper icloud uidocument

7
推荐指数
2
解决办法
3144
查看次数

Assembly.CreateInstance和安全性

我正在考虑使用C#的能力来按需编译代码作为脚本语言的基础.我想知道,我怎么能沙箱我正在执行的脚本,以便他们无法访问文件系统,网络等.基本上,我想要对正在运行的脚本的限制权限.

我采取的步骤:

CompilerResults r = CSharpCodeProvider.CompileAssemblyFromSource(source);

Assembly a = r.CompiledAssembly;

IScript s = a.CreateInstance(...);

s.EntryPoint(...);
Run Code Online (Sandbox Code Playgroud)

c# security scripting

6
推荐指数
1
解决办法
309
查看次数

如何使用自定义枚举器避免无限递归?

我做了一个扩展方法来查找集合中连续值的数量.因为它是通用的,所以我允许调用者定义"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)

c# recursion

6
推荐指数
1
解决办法
446
查看次数