小编Wil*_*ler的帖子

如何实现需要重复成员名称的接口?

我经常需要实现一些接口,例如IEnumerable<T>在我的代码中.

每次,当自动实现时,我会遇到以下情况:

public IEnumerator<T> GetEnumerator() {
    // Code here...
}

public IEnumerator GetEnumerator1() {
    // Code here...
}
Run Code Online (Sandbox Code Playgroud)

虽然我必须实现两个GetEnumerator()方法,但它们不可能具有相同的名称,即使我们知道它们以某种方式执行相同操作.编译器不能将它们视为另一个的重载,因为只有返回类型不同.

这样做时,我设法将GetEnumerator1()访问者设置为private.这样,编译器就不会抱怨没有实现接口成员,而只是NotImplementedException在方法体内抛出一个.

但是,我想知道这是一个好的做法,还是我将以不同的方式进行,也许是方法别名或类似的东西.

实现接口时最好的方法是什么,例如IEnumerable<T>需要实现两个具有相同名称的不同方法?

编辑#1

VB.NET在实现接口时的反应是否与C#不同,因为在VB.NET中它是明确实现的,因此强制执行GetEnumerator1().这是代码:

Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of T) Implements System.Collections.Generic.IEnumerable(Of T).GetEnumerator
    // Code here...
End Function

Public Function GetEnumerator1() As System.Collections.Generic.IEnumerator Implements System.Collections.Generic.IEnumerable.GetEnumerator
    // Code here...
End Function
Run Code Online (Sandbox Code Playgroud)

两种GetEnumerator()方法都是显式实现的,编译将拒绝它们具有相同的名称.为什么?

ienumerable ienumerator implementation interface .net-2.0

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

通过反射获取接口类型的构造函数,是否有比循环类型更好的方法?

我写了一个泛型类型:IDirectorySource<T> where T : IDirectoryEntry,我使用的是通过我的接口的对象来管理Active Directory中的条目,其中:IGroup,IOrganizationalUnit,IUser.

这样我就可以写下面的内容:

IDirectorySource<IGroup> groups = new DirectorySource<IGroup>(); // Where IGroup implements `IDirectoryEntry`, of course.`

foreach (IGroup g in groups.ToList()) {
    listView1.Items.Add(g.Name).SubItems.Add(g.Description);
}
Run Code Online (Sandbox Code Playgroud)

IDirectorySource<T>.ToList()方法中,我使用反射来找出类型参数的适当构造函数T.但是,由于T给定了一个接口类型,它根本找不到任何构造函数!

当然,我有一个internal class Group : IGroup实现IGroup接口的.无论我多么努力,我都无法弄清楚如何通过我的实现类从我的界面中获取构造函数.

[DirectorySchemaAttribute("group")]
public interface IGroup {
}

internal class Group : IGroup {
    internal Group(DirectoryEntry entry) {
        NativeEntry = entry;
        Domain = NativeEntry.Path;
    }
    // Implementing IGroup interface... …
Run Code Online (Sandbox Code Playgroud)

c# generics reflection dependency-injection interface

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

在C#中截断CSV文件

我有一个包含48行整数的CSV文件.我使用visual c#的openfiledialog功能允许用户选择此文件.然后我想让程序将该文件截断为24行.是否有截断功能我可以轻松地使用它?如果不是我怎么能这样做?以下是我到目前为止的情况......

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace sts_converter
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void select_Click(object sender, EventArgs e)
        {
            int size = -1;
            DialogResult result = openFileDialog1.ShowDialog(); // Show the dialog.
            if (result == DialogResult.OK) // Test result.
            {
                string file = openFileDialog1.FileName;
                try
                {
                    string text = File.ReadAllText(file);
                    size = text.Length;
                }
                catch (IOException)
                {
                } …
Run Code Online (Sandbox Code Playgroud)

c# csv truncate

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

我的字符集有什么问题(Win32 API)

我目前正在使用本教程学习Win32 ,并且我很难用我显示的角色.

比如这段代码在创建时向我的窗口添加一个菜单:

    case WM_CREATE: {
            HMENU hMenu, hSubMenu;
            HICON hIcon, hIconSm;

            hMenu = CreateMenu();
            hSubMenu = CreatePopupMenu();

            AppendMenu(hSubMenu, MF_STRING, ID_FILE_EXIT, "Exit");
            AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "File");

            hSubMenu = CreatePopupMenu();
            AppendMenu(hSubMenu, MF_STRING, ID_STUFF_GO, "&GO");
            AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&Stuff");

            SetMenu(hwnd, hMenu);

            hIcon = LoadImage(NULL, "Stuff.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE);

            if (hIcon)
                SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
            else
                MessageBox(hwnd, "Could not load large icon!", "Load Error", MB_OK | MB_ICONERROR);

            hIconSm = LoadImage(NULL, "Stuff.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE);

            if(hIconSm) …
Run Code Online (Sandbox Code Playgroud)

c winapi menu windows-messages

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

使用NHibernate而不使用鉴别​​器来保持每个类层次结构的一个表?

我有一个接口和一个实现此接口的类.

public interface IPhase {
    string Description { get; set; }
    int Id { get; }
    string Phase { get; set; }
}

public class Phase : IPhase {
    // Implementation here...
}
Run Code Online (Sandbox Code Playgroud)

现在,使用NHibernate 2.1.2.GA,我希望使用table-per-class-hierarchy来映射接口及其实现者,实际上,我不需要一个鉴别器,因为这个实现者将是唯一的类持久化在这张表中.我现在还没有使用NHibernate大约一年半,我在这里遇到了一些内存空白......

我已经阅读了这个问题和相关的答案,除了我没有使用FNH.
NHibernate映射:将层次结构保存到单个表而不带鉴别器

  1. 我想知道这个discriminator属性在使用时是否是强制性的subclass

  2. 在这个特定的上下文中,我的XML映射会是什么样子?

谢谢你的帮助!

nhibernate interface nhibernate-mapping table-per-hierarchy discriminator

0
推荐指数
1
解决办法
1783
查看次数

Oracle问题:ORA-00972:标识符太长/ NHibernate.Exceptions.GenericADOException:无法执行查询

这是NHibernate对Oracle数据库执行的查询:

select
    compteurra0_.NO_SEQ_CPTE_RAPP_ACCES_INFO_DSQ as NO1_2_,
    compteurra0_.TXT_INFO_COMPL as TXT2_2_,
    compteurra0_.TYP_CPTE_RAPP_ACCES_DSQ as TYP3_2_,
    compteurra0_.VAL_CPTE_RAPP_ACCES_DSQ as VAL4_2_,
    compteurra0_.VAL_CPTE_ATNDU as VAL5_2_,
    compteurra0_.ID_UTIL_CREAT_OCC as ID6_2_,
    compteurra0_.DHC_OCC as DHC7_2_,
    compteurra0_.NO_SEQ_RAPP_ACCES_INFO_DSQ as NO8_2_ 
from
    ESO.ESO_V_CPTE_RAPP_ACCES_DSQ compteurra0_
Run Code Online (Sandbox Code Playgroud)

当我对数据库执行此查询时,它返回Oracle错误:

  • ORA-00972: identifier is too long

我在互联网上搜索过,发现2005年使用NHibernate和Oracle报告了一个错误: Oracle issue: ORA-00972: identifier is too long

  • 这真的解决了吗?

我找到了另外两个相关的SO问题,说明在Java中使用Hibernate的解决方案.

CompteurRapportAcces.cs

public class CompteurRapportAcces : AuditableEntity {
    public virtual string InformationComplementaire { get; set; }
    public …
Run Code Online (Sandbox Code Playgroud)

.net sql oracle nhibernate ora-00972

0
推荐指数
1
解决办法
6632
查看次数