小编Thi*_*heT的帖子

模型视图Presenter嵌套

我遇到了需要嵌套MVP模式的场景.最好用一个可视化的例子来解释:

------------------------------
| [View]                     |
|   |                        |
|   +----[Presenter]         |
|             |              |
|             +------[Model] |
|____________________________|
            |
            +----[View]
                   |
                   +----[Presenter]
                             |
                             +------[Model]
Run Code Online (Sandbox Code Playgroud)

这就是两个MVP层应该如何交互的方式.我的问题是关于两者之间的联系.我可以设想几种方法来连接这两种方式:

  • 第1层的Presenter连接到第2层的视图.
  • 方法1中的模型连接到方法2的视图.
  • 对于第2层的视图IS的第1层(在视图包含对M,V,和第1层的p个参考文献).
  • 从第1层演示或模型IS为第2层的视图.

哪个是正确的,如果有的话?

然后是他们如何联系的问题.第2层视图是否应该引用第1层中的一个对象?互动应该纯粹基于事件吗?两者的组合(如果是这样,参考应该在哪里?)?

我很擅长使用这些类型的模式,所以任何见解都会受到赞赏.

mvp nested model view presenter

11
推荐指数
0
解决办法
557
查看次数

使用数组的SetValue方法与[]索引器

我注意到数组有SetValue方法,当你可以使用索引器时,它看起来有点不合适.SetValue有一些特殊用途吗?MSDN文章似乎没有说出SetValue的用途,只是如何使用它.就速度而言,使用哪种方法会更有效?

c# arrays indexer setvalue

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

Stack <T>实现ICollection,但具有来自ICollection <T>的方法

我正在尝试创建一个基于的自定义集合Stack<T>.当我看Stack<T>[从元数据]在Visual Studio中,它表明,Stack<T>工具ICollection,这将需要它来实现ICollectionCopyTo(Array array, index)方法,但是相反,它被示为具有ICollection<T>CopyTo(T[] array, index)方法.有人可以解释为什么会这样吗?

我正在尝试创建一个模仿Stack<T>相当多的集合.当我ICollection像堆栈一样实现时,它需要我使用该CopyTo(Array array, index)方法,但我真正想要的是使用该CopyTo(T[] array, index)方法,就像Stack<T>这样.有没有办法实现这个没有实现ICollection<T>

.net stack generic-collections interface-implementation

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

创建现有装配/模块的动态副本

是否可以创建程序集或模块/类的动态副本?我可以很容易地找到如何从头开始创建使用动态装配或模块AssemblyBuilder/ ModuleBuilder(所看到这里),但有一种方式来创建一个现有的集或类型的副本,其各自的生成器类型?

编辑1

例如,假设您有一个标准的控制台应用程序,其中包含必需的Program类和Main方法,并且您将另一个类添加到项目中,称为"A".我的目标是AMain方法中使用ModuleBuilder或类似的东西创建类的动态副本.

编辑2

我想要复制类的原因A是因为我想要一个完全相同的类A,包括方法,字段,属性等,但是动态创建.我想要的是,必须使用TypeBuilder/CodeDom手动创建类型及其所有成员(方法,字段,属性等),因为在某些情况下,我可能不知道所有关于一个类及其内部工作或类可能很大,繁琐/不可能使用这种方法重现.

希望一些伪代码可以说明我在寻找什么:

// create AssemblyBuilder using the assembly of the A class so you end up with a
// dynamic copy of the assembly
AssemblyBuilder ab = new AssemblyBuilder(Assembly.GetAssembly(typeof(A)));

// get the Type as a TypeBuilder from the AssemblyBuilder
TypeBuilder tb = ab.GetModule("Test.exe").GetType(typeof(A).FullName);
Run Code Online (Sandbox Code Playgroud)

我基本上只想把它Assembly当作一个AssemblyBuilderType一个TypeBuilder.我也不需要能够保存程序集.

c# reflection dynamic-assemblies

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

C# 如何获取 COM 接口的实例

我做了很多谷歌搜索,试图找到获取 COM 接口实例的标准方法。

Microsoft 在其文章COM Interop 第 1 部分:客户端教程中提供了一个示例:

// Create an instance of a COM coclass:
FilgraphManager graphManager = new FilgraphManager();

// See if it supports the IMediaControl COM interface. 
// Note that this will throw a System.InvalidCastException if 
// the cast fails. This is equivalent to QueryInterface for 
// COM objects:
IMediaControl mc = (IMediaControl) graphManager;

// Now you call a method on a COM interface: 
mc.Run();
Run Code Online (Sandbox Code Playgroud)

然而,看起来好像他们正在实例化一个 COM 对象并将其转换为 COM 接口。

对于我感兴趣的接口,IDesktopWallpaper似乎没有可实例化的实现 COM 对象。 …

c# com interop com-interop

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

C# 使用具有值类型的属性和 Delegate.CreateDelegate

使用 Jon Skeet 的文章让反射飞行和探索委托作为指南,我尝试使用 Delegate.CreateDelegate 方法将属性复制为委托。这是一个示例类:

public class PropertyGetter
{
    public int Prop1 {get;set;}
    public string Prop2 {get;set;}

    public object GetPropValue(string propertyName)
    {
        var property = GetType().GetProperty(propertyName).GetGetMethod();
        propertyDelegate = (Func<object>)Delegate.CreateDelegate(typeof(Func<object>), this, property);

        return propertyDelegate();
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当我调用GetPropValue"Prop1"作为参数传入时,我收到了带有消息ArgumentException的调用 使用任何返回原始/值类型(包括结构)的属性时会发生这种情况。Delegate.CreateDelegate"Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type."

有人知道一种能够在这里同时使用引用和值类型的方法吗?

c# reflection primitive delegates value-type

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

C#扩展方法重载

我有两种扩展方法:

    public static string ToString(this List<object> list, char delimiter)
    {
        return ToString<object>(list, delimiter.ToString());
    }

    public static string ToString(this List<object> list, string delimiter)
    {
        return ToString<object>(list, delimiter);
    }
Run Code Online (Sandbox Code Playgroud)

我用这个时:

    char delimiter = ' ';
    return tokens.ToString(delimiter);
Run Code Online (Sandbox Code Playgroud)

它不会起作用.char重载也不会出现在代码完成列表中.任何人都可以告诉我如何使这项工作?

编辑

我不小心忘了提到实际上有3种扩展方法,第三种是:

    public static string ToString<T>(this List<T> list, string delimiter)
    {
        if (list.Count > 0)
        {
            string s = list[0].ToString();

            for (int i = 1; i < list.Count; i++)
                s += delimiter + list[i].ToString();

            return s;
        }

        return "";
    }
Run Code Online (Sandbox Code Playgroud)

c# extension-methods overloading

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