如何将两种不同的类型传递到c#中的函数param中?
在c#如果我有这个如何将两种不同的类型传递到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
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()
方法,因此我在编写答案时不知道您需要这些。