【问题标题】:Dynamicly Converting Type Object to Type (Some Class)将类型对象动态转换为类型(某些类)
【发布时间】:2013-09-21 20:24:37
【问题描述】:

我希望我的一些方法采用 Object 并将其转换为可用类型:

*简单示例

public void PostAction (object act){
    object Action = (act.GetType) act;
    string ActionName = Action.PostName;
}

通过浏览互联网和 Stackoverflow,我发现只有在没有类型的情况下调用对象方法的方法

public void PostAction (object act){
    Type t = act.GetType(); // myObject.GetType() would also work
    MethodInfo GetPostName = t.GetMethod("GetPostName");
    GetPostName.Invoke(act, null);
}

有没有更好的方法?我可以将对象转换为它的类型吗?

【问题讨论】:

    标签: c# object types casting type-conversion


    【解决方案1】:

    你可以使用dynamic:

    public void PostAction (object act){
        ((dynamic)act).GetPostName();
    }
    

    但我会更进一步并改变方法:

    1. 使用GetPostName 方法声明接口:

      public interface IMyInterface
      {
          void GetPostName();
      }
      
    2. 在你的类中实现接口

    3. PostAction方法改成IMyInterface参数:

      public void PostAction(IMyInterface act)
      
    4. 使用PostAction方法的接口方法:

      public void PostAction(IMyInterface act)
      {
          act.GetPostName();
      }
      

    好处:

    • 会给你一个编译时类型安全
    • 会更快,因为不需要反射

    【讨论】:

    • 感谢您的快速回复,我将尝试在我的一些代码中使用该接口....我只看到一个问题:我有一种方法可以获取一个对象,(切片)和替换它在对象(整体)中的相应切片.....我需要投射它吗?或者我可以在接口中返回对象本身并进行转换吗?还是有其他花哨的方法来做到这一点:)
    • 您可以将方法返回类型指定为接口。实际上,这是很常见的做法。
    • 你介意发布一个演示吗!谢谢大家!
    【解决方案2】:

    您实际上不应该使用反射来调用您传入的对象的方法。 使用对象作为方法的参数类型也不是真正的最佳实践。 你通常希望你的代码是强类型的。

    无论如何,如果您希望“对象”作为参数的类型,只需将对象转换为接口或类型:

        public interface IMyInterface
        {
            string GetPostName();
        }
    
        public void PostAction(object actObject)
        {
            var action = actObject as IMyInterface;
            if (action != null)
            {
                var postName = action.GetPostName();
            }
        }
    

    如果你像这样强制转换,如果对象没有实现该接口,结果可能为 null,这就是为什么你可能想要检查 null...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多