如何将两种不同的类型传递到c#中的函数param中?

如何将两种不同的类型传递到c#中的函数param中?,c#,C#,在c#如果我有这个 private void Run(Web site) { site.BreakRoleInheritance(false, false); } private void Run(ListItem folder) { folder.BreakRoleInheritance(false, false); } 如何生成一个可以接受站点或文件夹的函数?如果站点和文件夹是您创建的类,那么您可以创建这些类继承自的公共接口。例如: public interface IB

在c#如果我有这个

private void Run(Web site) {
    site.BreakRoleInheritance(false, false);
}

private void Run(ListItem folder) {
    folder.BreakRoleInheritance(false, false);
}

如何生成一个可以接受
站点
文件夹
的函数?

如果
站点
文件夹
是您创建的类,那么您可以创建这些类继承自的公共接口。例如:

public interface IBreakable
{
    void break();
}

public class Folder : IBreakable 
{
    public void break() { /* implementation here*/ }
}

public class Site : IBreakable 
{
    public void break() { /* implementation here*/ }
}
用法

private void Run(IBreakable breakable)
{
    breakable.break();
}
Foo foo = new Foo();
Bar bar = new Bar();
Bad bad = new Bad();

Run(foo);
Run(bar);
Run(bad);
编辑

这里有一个基于反射的解决方案,尽管这并不理想

void Run(object obj)
{
    MethodInfo method = obj.GetType().GetMethod("break");

    if (!(method is null))
    {
        method.Invoke(obj, new object[] {});
    }
}
给定的

public class Foo
{
    public void break() {Console.WriteLine("Foo");}
}

public class Bar
{
    public void break() {Console.WriteLine("Bar");}
}

public class Bad
{
    public void NotBreak() {Console.WriteLine("Bad");}
}
用法

private void Run(IBreakable breakable)
{
    breakable.break();
}
Foo foo = new Foo();
Bar bar = new Bar();
Bad bad = new Bad();

Run(foo);
Run(bar);
Run(bad);
输出

酒吧


正如@Pedro后来的回答所指出的,这些特定的类来自一个共同的祖先,这将是首选。假设您没有该选项:

您可以使用C#动态类型(很抱歉,如果这不是最新的文档,我找不到更新的文档):

例如:

using System;
                
public class Program
{
    public static void Main()
    {
        var foo = new Foo();
        var bar = new Bar();
        DoSomething(foo);
        DoSomething(bar);
    }

    private static void DoSomething<T>(T someObjectWithDoMethod)
    {
        ((dynamic)someObjectWithDoMethod).Do();
    }
}

public class Foo
{
  public void Do() { Console.WriteLine("Foo is doing something"); }
}

public class Bar
{
  public void Do() { Console.WriteLine("Bar is doing something"); }
}
使用系统;
公共课程
{
公共静态void Main()
{
var foo=new foo();
var bar=新的bar();
DoSomething(foo);
剂量测定法(巴);
}
专用静态无效剂量仪(T someObjectWithDoMethod)
{
((动态)someObjectWithDoMethod).Do();
}
}
公开课Foo
{
public void Do(){Console.WriteLine(“Foo正在做某事”);}
}
公共类酒吧
{
public void Do(){Console.WriteLine(“Bar正在做某事”);}
}

.Net Fiddle:

根据您对其他答案的评论,
Web
ListItem
是在
Microsoft.SharePoint.Client
中定义的类型

在检查SDK文档时,这两种类型都源自方法的定义位置

在这种情况下,您只需定义一个方法,将
SecurableObject
对象作为输入:

public void Run(SecurableObject item)
{
    item.BreakRoleInheritance();
}

您应该能够将
Web
ListItem
传递给同一个方法。

这两个类来自SDK,因此我无法让它实现。@omega您能够提供SDK的详细信息吗。可能它们确实有一个公共接口/基类。我将使用反射提供另一个解决方案。SDK是
Microsoft.SharePoint.Client
@omega请参阅我的编辑。还值得注意的是,
文件夹
站点
的文档在
ClientObject
上有一个共同的继承。也许
ClientObject
有你想要使用的方法。我用
SecurableObject
找到了它,它支持大多数常用方法,最后一个问题必须使用反思。使用界面这是解决这类问题的最佳方式。你似乎在为问题中应该包含的答案添加大量注释。添加所有约束以及为什么不能使用公共方法因为没有.Update(),所以我不得不使用反射there@omega我很高兴你能弄明白。只是一个建议,请确保您在问题本身中包含尽可能多的细节,例如,在问题中没有提到
.Update()
方法,因此我在编写答案时不知道您需要这些。