小编B.K*_*.K.的帖子

Console.WriteLine()和需要这么多的参数重载?

我正在浏览文档并注意到该Console.WriteLine()方法有几个重载.特别是,我的好奇心和部分混淆与这些有关:

public static void WriteLine(string format, params object[] arg);
public static void WriteLine(string format, object arg0);
public static void WriteLine(string format, object arg0, object arg1);
public static void WriteLine(string format, object arg0, object arg1, object arg2);
public static void WriteLine(string format, object arg0, object arg1, object arg2, object arg3);
Run Code Online (Sandbox Code Playgroud)

这似乎是多余的.第一个超载的其他四个重载需要什么?第一种方法能够完成其他方法可以做的所有事情.是否有一个性能问题,他们试图通过提供额外的重载来处理,最多可以处理四个参数(最后一个)?通过最多四个参数的数组的开销是否足以满足这些重载的需要?

c#

86
推荐指数
2
解决办法
5781
查看次数

在C#中重命名目录

我无法在任何地方找到DirectoryInfo.Rename(To)或FileInfo.Rename(To)方法.所以,我写了自己的,我在这里发布,供任何人使用,如果他们需要它,因为让我们面对它:MoveTo方法是过度的,如果你只是想重命名一个目录或文件,将总是需要额外的逻辑:

public static class DirectoryExtensions
{
    public static void RenameTo(this DirectoryInfo di, string name)
    {
        if (di == null)
        {
            throw new ArgumentNullException("di", "Directory info to rename cannot be null");
        }

        if (string.IsNullOrWhiteSpace(name))
        {
            throw new ArgumentException("New name cannot be null or blank", "name");
        }

        di.MoveTo(Path.Combine(di.Parent.FullName, name));

        return; //done
    }
}
Run Code Online (Sandbox Code Playgroud)

c# directory file-io rename

61
推荐指数
3
解决办法
11万
查看次数

WPF/C#将自定义对象列表数据绑定到ListBox?

我遇到了一些能够将我的自定义对象列表的数据绑定到ListBoxWPF 中的墙.

这是自定义对象:

public class FileItem
{
    public string Name { get; set; }
    public string Path { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是清单:

private List<FileItem> folder = new List<FileItem>();
public List<FileItem> Folder { get { return folder; } }
Run Code Online (Sandbox Code Playgroud)

该列表由FileSystemWatcher文件移动,删除,重命名等填充和维护.所有列表都保留了名称和路径的跟踪.

这是我在MainWindow代码隐藏文件中所拥有的内容(现在它的硬编码用于测试目的):

FolderWatcher folder1 = new FolderWatcher();
folder1.Run(@"E:\MyApp\test", "*.txt");

listboxFolder1.ItemsSource = folder1.Folder;
Run Code Online (Sandbox Code Playgroud)

这是我的XAML部分:

<ListBox x:Name="listboxFolder1" Grid.Row="1" BorderThickness="0" 
         ItemsSource="{Binding}"/>
Run Code Online (Sandbox Code Playgroud)

不幸的是,唯一显示的是MyApp.FileItem每个条目.如何显示名称等特定属性?

c# wpf listbox list listboxitems

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

datagridview中的垂直文本

我想以垂直方向显示标题单元格中的文本.我该怎么做?

谢谢

.net c# datagridview vertical-text winforms

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

动态加载DLL

我有一个程序,需要使用大量的插件.

每个插件必须支持一个非常基本的接口,这个接口是在DLL中定义的(IBaseComponent是为了简化问题).

每个插件都在特定目录中(AppDirectory\plugin\plugin-type).每个插件都可以有插件的dll的任何名称(AppDirectory\plugin\plugin-type\plugin-name.dll).

所以我需要检查每个plugin子目录,找到每个插件都有一个支持IBaseComponent接口的类,实例化该类并调用插件上的一些函数.

好吧,一切都很好,花花公子,这一切都不是特别难.但问题是我似乎遇到了一些奇怪的问题.

每个插件都需要有在各个插件文件夹中的文件Base.dll(而不是仅仅在将被加载插件程序),也似乎我得到许多错误和警告周围的动态加载具有DLL的还一个dll需要加载.

我正在使用:

pluginModule = System.Reflection.Assembly.ReflectionOnlyLoadFrom(PathToAssembly);
Run Code Online (Sandbox Code Playgroud)

为了获取插件dll并使用:

types = moduleAssembly.GetTypes();
Run Code Online (Sandbox Code Playgroud)

为了获取dll中包含的类型.我正在遍历类型并检查单个类型是否属于IBaseComponent接口(表示这对于加载类是有效的):

if (type.GetInterface("FrameworkNameSpace.IBaseComponent") != null)
    //it's of the IBaseComponent interface
Run Code Online (Sandbox Code Playgroud)

稍后,为了从我使用的dll实际创建类的实例:

pluginModule = System.Reflection.Assembly.LoadFrom(PathToAssembly);
Run Code Online (Sandbox Code Playgroud)

然后使用:

types = component.GetTypes();
Run Code Online (Sandbox Code Playgroud)

为了获取模块中的类型,然后选择并加载支持与上面相同的接口的类.

当我使用时,问题似乎就出现了:

types = component.GetTypes();
Run Code Online (Sandbox Code Playgroud)

当实际尝试加载类时,而不是简单地看着它.(因此我对LoadFromReflectionOnlyLoad的不同用法)

我在GetTypes调用上收到的异常(在第二个插件上,但从来没有第一个!)是:

{"Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information."}
Run Code Online (Sandbox Code Playgroud)

使用LoaderExceptions属性:

{"The specified module could not be found. (Exception from HRESULT: 0x8007007E)":null}
Run Code Online (Sandbox Code Playgroud)

我不确定为什么会这样.DLL位于plugin文件夹中,包含IBaseComponent接口的DLL也位于每个插件目录中.我是以错误的方式来做这件事的吗?

也就是保持每个插件子目录以及程序本身使用的一个内含有IBaseComponent的DLL的一个副本就需要我,还是我做一些错误,让我删除这一要求?

我知道MEF这是我想要使用但不幸的是因为我需要在.net 2.0上支持这个我无法使用MEF.

.net c# dll plugins interface

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

将二进制文件读入结构(C++)

所以我遇到了一个无法正确读取二进制文件到我的结构中的问题.结构是这样的:

struct Student
{
    char name[25];
    int quiz1;
    int quiz2;
    int quiz3;
};
Run Code Online (Sandbox Code Playgroud)

它是37个字节(来自char数组的25个字节,每个整数4个字节).我的.dat文件是185个字节.这是5名学生,有3个整数等级.因此每个学生占用37个字节(37*5 = 185).

它看起来像这样的纯文本格式:

Bart Simpson          75   65   70
Ralph Wiggum          35   60   44
Lisa Simpson          100  98   91
Martin Prince         99   98   99
Milhouse Van Houten   80   87   79
Run Code Online (Sandbox Code Playgroud)

我可以使用以下代码单独读取每个记录:

Student stud;

fstream file;
file.open("quizzes.dat", ios::in | ios::out | ios::binary);

if (file.fail())
{
    cout << "ERROR: Cannot open the file..." << endl;
    exit(0);
}

file.read(stud.name, sizeof(stud.name));
file.read(reinterpret_cast<char *>(&stud.quiz1), sizeof(stud.quiz1));
file.read(reinterpret_cast<char *>(&stud.quiz2), sizeof(stud.quiz2));
file.read(reinterpret_cast<char *>(&stud.quiz3), sizeof(stud.quiz3));

while(!file.eof()) …
Run Code Online (Sandbox Code Playgroud)

c++ binary file-io struct file

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

为什么ReadOnlyCollection不允许协方差?

此代码工作的原因是由于Enumerator无法修改集合的事实:

var roList = new List<string>() { "One", "Two", "Three" };
IEnumerable<object> objEnum = roList;
Run Code Online (Sandbox Code Playgroud)

如果我们尝试用a做同样的事情List<object>,而不是IEnumerable<object>,我们会得到一个编译器错误告诉我们我们不能隐式地将类型转换List<string>List<object>.好吧,那个是有道理的,在我看来,这是微软的一个很好的决定,作为从数组中吸取的教训.

但是,我无法弄清楚为什么世界上这条强硬的规则适用于类似的东西ReadOnlyCollection?我们将无法修改其中的元素ReadOnlyCollection,因此导致Microsoft阻止我们使用只读内容的协方差的安全问题是什么?是否有可能修改Microsoft试图考虑的集合类型,例如通过指针?

c# covariance readonly-collection

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

为什么GAC中的所有程序集都不是作为MSIL构建的?

是什么原因导致全局程序集缓存(GAC)中的所有程序集都不是构建为MSIL?我看到x86AMD64一些程序集使用的体系结构类型,如下例所示,但不适用于其他程序集:

C:\Windows\assembly\

在此输入图像描述

为什么System.Data建了两个不同的处理器架构,而System.CoreMSIL

C:\Windows\Microsoft.NET\assembly

在此输入图像描述

在上面显示的第二版GAC下可以看到类似的模式.程序集分为不同的体系结构,但并非所有体系结构都构建在32/64版本中 - 有些只是MSIL.

.net gac gac-32 gac-64 gac-msil

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

单个控制台应用程序中的多个控制台

我创建了一个C#项目,其中包含多个控制台应用程序.现在我的问题是:当我运行一个应用程序时是否可以显示多个控制台?如果有,怎么样?

可以说,我有一个测试应用程序,这是主要的应用程序.我有另外两个控制台应用程序说,ABCXYZ.现在,当我运行测试应用程序时,应该出现应用程序ABC和XYZ的控制台.

我写了以下代码:

Console.WriteLine("\n\t Calling EXE...");
Process myProcess = new Process();
string Exepath = System.IO.Directory.GetCurrentDirectory() + "\\exe\\ABCApplication.exe";
try
{
    myProcess.StartInfo.UseShellExecute = false;
    myProcess.StartInfo.FileName = Exepath;
    myProcess.StartInfo.CreateNoWindow = false;
    myProcess.Start();
}

catch (Exception ex)
{
    CreateLogFile();
}
Run Code Online (Sandbox Code Playgroud)

c# console-application

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

如何在保留其大小的同时自动将WPF窗口捕捉到屏幕边缘?

当应用程序启动时,我希望我的WPF窗口自动捕捉到屏幕的右边缘.有没有办法做到这一点?我也想保留它的尺寸.因此,与将窗口拖动到屏幕边缘时发生的捕捉行为不同,导致窗口调整大小到屏幕的一部分或全屏,我希望我的窗口只是捕捉到某个位置的边缘默认情况下或之后由用户拖动到特定位置,而不调整大小.我仍然希望保留用户将窗口拖离边缘的能力.

有没有已经实现过的东西,还是我必须创建自己的行为模式?我尝试了很多搜索关键字组合,但找不到类似于我正在做的事情.一些搜索包括禁用捕捉行为或提供捕捉行为,但没有像我上面描述的那样.

编辑:

我找不到一个现成的解决方案,所以我写了自己的解决方案.这个解决方案基于BenVlodgi的建议,所以我感谢他帮助我.这是一个非常粗略的实现,仍然需要大量的抛光和更好的代码技术,但它的工作原理,它是任何想要尝试这个的人的良好基础.它非常简单,与WPF配合得非常好.这个实现的唯一限制是我还没有尝试过它可以使用两个屏幕,但它非常简单(我只是没有时间用它而且我现在不需要那个功能) .所以,这是代码,我希望它可以帮助那里的人:

public partial class MainWindow : Window
{
    // Get the working area of the screen.  It excludes any dockings or toolbars, which
    // is exactly what we want.
    private System.Drawing.Rectangle screen = 
                                 System.Windows.Forms.Screen.PrimaryScreen.WorkingArea;

    // This will be the flag for the automatic positioning.
    private bool dragging = false;

    //  The usual initialization routine
    public MainWindow()
    {
        InitializeComponent();
    }

    // Wait until window is lodaded, but prior to being rendered to set position.  This 
    // is …
Run Code Online (Sandbox Code Playgroud)

.net c# wpf

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