Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#来自对象的静态方法_C# - Fatal编程技术网

C#来自对象的静态方法

C#来自对象的静态方法,c#,C#,我有各种不同类型的物品。 对于它们,我想调用它们类的静态方法。所有类共享相同的方法。 如何在不显式调用类的情况下调用此静态方法?是否要调用每个类上的每个方法?您必须显式地调用它们,分别引用每个类 每个类的静态方法是否都有相同的公共代码?将它放入一个静态类中供所有其他类使用,或者创建一个或多个扩展方法。是否要调用每个类上的每个方法?您必须显式地调用它们,分别引用每个类 每个类的静态方法是否都有相同的公共代码?将它放入一个静态类中,供所有其他类使用,或创建一个或多个扩展方法。如果这些类都扩展同一基类

我有各种不同类型的物品。 对于它们,我想调用它们类的静态方法。所有类共享相同的方法。
如何在不显式调用类的情况下调用此静态方法?

是否要调用每个类上的每个方法?您必须显式地调用它们,分别引用每个类


每个类的静态方法是否都有相同的公共代码?将它放入一个静态类中供所有其他类使用,或者创建一个或多个扩展方法。

是否要调用每个类上的每个方法?您必须显式地调用它们,分别引用每个类


每个类的静态方法是否都有相同的公共代码?将它放入一个静态类中,供所有其他类使用,或创建一个或多个扩展方法。

如果这些类都扩展同一基类,则对基类调用该方法将有效

例如:

public class Base
{
  public static DoSomething()
  {
    //something
  }
}

public class A: Base
{
}

public class B: Base
{
}
以下方法调用执行相同的代码:

A.DoSomething();
B.DoSomething();
Base.DoSomething();

如果这些类都扩展了相同的基类,那么在基类上调用方法就可以了

例如:

public class Base
{
  public static DoSomething()
  {
    //something
  }
}

public class A: Base
{
}

public class B: Base
{
}
以下方法调用执行相同的代码:

A.DoSomething();
B.DoSomething();
Base.DoSomething();

您可以通过在每个调用相应静态方法的对象中放置一个方法来实现这一点。然而,您希望这样做的事实表明,您的设计可能会得到改进。如果你能告诉我们你想实现什么,也许有人能提出更好的方法。

你可以通过在每个调用相应静态方法的对象中放置一个方法来实现这一点。然而,您希望这样做的事实表明,您的设计可能会得到改进。如果你能告诉我们你想实现什么,也许有人能提出更好的方法。

你是否在寻找类似于
列表的东西,其中所有对象都保证有一个名为MethodX()的静态方法

如果是这样的话,您可以对它们进行反思,查找方法名称并执行它


或者像其他人提到的那样继承(这将是正确的方式)。

您是否正在寻找类似于
列表的东西,其中所有对象都保证有一个名为MethodX()的静态方法

如果是这样的话,您可以对它们进行反思,查找方法名称并执行它


或者像其他人提到的那样继承(这将是正确的方式)。

如果您需要为每种类型都有一个特定的实现,我认为静态方法不是正确的方法。。。相反,您应该定义一个由所有类实现的接口。然后,可以在每个对象上调用接口定义的实例方法:

public interface IDoSomething
{
    void DoSomething();
}

public class A: IDoSomething
{
    public void DoSomething()
    {
        // implementation for A
    }
}

public class B: IDoSomething
{
    public void DoSomething()
    {
        // implementation for B
    }
}

当然,如果您不需要每种类型的特定实现,那么您可以调用Base.DoSomething(如David所解释)

如果您需要每种类型的特定实现,我认为静态方法不是正确的方法。。。相反,您应该定义一个由所有类实现的接口。然后,可以在每个对象上调用接口定义的实例方法:

public interface IDoSomething
{
    void DoSomething();
}

public class A: IDoSomething
{
    public void DoSomething()
    {
        // implementation for A
    }
}

public class B: IDoSomething
{
    public void DoSomething()
    {
        // implementation for B
    }
}

当然,如果您不需要每种类型的具体实现,那么您可以直接调用Base.DoSomething(正如David所解释的)

我不确定您到底想做什么。但是利用我的想象力,我想出了这个实现

internal class Program
{
  private static void Main(string[] args)
  {
    var staticMethodClasses = new List<StaticMethodClassBase> 
                                         {new ClassA(), new ClassB()};

    foreach (StaticMethodClassBase item in staticMethodClasses)
    {
      Type t = item.GetType();
      MethodInfo staticMethod = 
           t.GetMethod("DoSomething", BindingFlags.Static | BindingFlags.Public);
      staticMethod.Invoke(null, null);
    }
  }
}

public abstract class StaticMethodClassBase
{
}

public class ClassA : StaticMethodClassBase
{
    public static void DoSomething()
    {
        Console.WriteLine("Class A");
    }
}

public class ClassB : StaticMethodClassBase
{
    public static void DoSomething()
    {
        Console.WriteLine("Class B");
    }
}
内部类程序
{
私有静态void Main(字符串[]args)
{
var staticMethodClasses=新列表
{new ClassA(),new ClassB()};
foreach(StaticMethodClass中的StaticMethodClassBase项)
{
类型t=item.GetType();
MethodInfo staticMethod=
t、 GetMethod(“DoSomething”,BindingFlags.Static | BindingFlags.Public);
调用(null,null);
}
}
}
公共抽象类StaticMethodClassBase
{
}
公共类ClassA:StaticMethodClassBase
{
公共静态无效剂量测定法()
{
控制台写入线(“A类”);
}
}
公共类ClassB:StaticMethodClassBase
{
公共静态无效剂量测定法()
{
控制台写入线(“B类”);
}
}

我不确定你到底想做什么。但是利用我的想象力,我想出了这个实现

internal class Program
{
  private static void Main(string[] args)
  {
    var staticMethodClasses = new List<StaticMethodClassBase> 
                                         {new ClassA(), new ClassB()};

    foreach (StaticMethodClassBase item in staticMethodClasses)
    {
      Type t = item.GetType();
      MethodInfo staticMethod = 
           t.GetMethod("DoSomething", BindingFlags.Static | BindingFlags.Public);
      staticMethod.Invoke(null, null);
    }
  }
}

public abstract class StaticMethodClassBase
{
}

public class ClassA : StaticMethodClassBase
{
    public static void DoSomething()
    {
        Console.WriteLine("Class A");
    }
}

public class ClassB : StaticMethodClassBase
{
    public static void DoSomething()
    {
        Console.WriteLine("Class B");
    }
}
内部类程序
{
私有静态void Main(字符串[]args)
{
var staticMethodClasses=新列表
{new ClassA(),new ClassB()};
foreach(StaticMethodClass中的StaticMethodClassBase项)
{
类型t=item.GetType();
MethodInfo staticMethod=
t、 GetMethod(“DoSomething”,BindingFlags.Static | BindingFlags.Public);
调用(null,null);
}
}
}
公共抽象类StaticMethodClassBase
{
}
公共类ClassA:StaticMethodClassBase
{
公共静态无效剂量测定法()
{
控制台写入线(“A类”);
}
}
公共类ClassB:StaticMethodClassBase
{
公共静态无效剂量测定法()
{
控制台写入线(“B类”);
}
}

您能给我们提供更多的上下文吗?您能给我们提供更多的上下文吗?