私が持っている場合:
void MyMethod(Object obj) { ... }
obj
実際のタイプにキャストするにはどうすればよいですか?
obj.MyFunction();
実際のオブジェクトにその機能があることはわかっていますが、現在はコンパイルされません。
MyFunction
メソッドは何を宣言していますか?
私が持っている場合:
void MyMethod(Object obj) { ... }
obj
実際のタイプにキャストするにはどうすればよいですか?
obj.MyFunction();
実際のオブジェクトにその機能があることはわかっていますが、現在はコンパイルされません。
MyFunction
メソッドは何を宣言していますか?
回答:
実際のタイプがわかっている場合は、次のようにします。
SomeType typed = (SomeType)obj;
typed.MyFunction();
実際のタイプがわからない場合は、そうではありません。代わりに次のいずれかを使用する必要があります。
例えば:
// reflection
obj.GetType().GetMethod("MyFunction").Invoke(obj, null);
// interface
IFoo foo = (IFoo)obj; // where SomeType : IFoo and IFoo declares MyFunction
foo.MyFunction();
// dynamic
dynamic d = obj;
d.MyFunction();
as
型キャストとtype(of: ClassName)
インスタンスタイプをチェックする機能が見つかりました。
(リフレクションなしではありませんが)できるとは思わないので、関数にも型を指定する必要があります。
void MyMethod(Object obj, Type t)
{
var convertedObject = Convert.ChangeType(obj, t);
...
}
UPD:
これはあなたのために働くかもしれません:
void MyMethod(Object obj)
{
if (obj is A)
{
A a = obj as A;
...
}
else if (obj is B)
{
B b = obj as B;
...
}
}
JsonConvert.DeserializeObject(object.ToString());はどうでしょうか。
var myType = JsonConvert.DeserializeObject<MyType>(object.ToString());
私の場合、AutoMapperはうまく機能します。
AutoMapperは、明示的な構成なしで動的オブジェクトとの間でマップできます。
public class Foo {
public int Bar { get; set; }
public int Baz { get; set; }
}
dynamic foo = new MyDynamicObject();
foo.Bar = 5;
foo.Baz = 6;
Mapper.Initialize(cfg => {});
var result = Mapper.Map<Foo>(foo);
result.Bar.ShouldEqual(5);
result.Baz.ShouldEqual(6);
dynamic foo2 = Mapper.Map<MyDynamicObject>(result);
foo2.Bar.ShouldEqual(5);
foo2.Baz.ShouldEqual(6);
同様に、ディクショナリからオブジェクトに直接マップできます。AutoMapperは、キーとプロパティ名を並べます。
詳細情報https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping
この方法は最も効率的ではないかもしれませんが、単純であり、仕事をします。
これは2つの操作を実行します。最初に基本的にシリアル化である.ToString()を呼び出し、次にNewtonsoft nuget(インストールする必要があります)を使用して逆シリアル化します。
public T Format<T>(Object obj) =>
JsonConvert.DeserializeObject<T>(obj.ToString());
MyFunction()
メソッドが1つのクラス(およびその子孫)でのみ定義されている場合は、
void MyMethod(Object obj)
{
var o = obj as MyClass;
if (o != null)
o.MyFunction();
}
呼び出す関数を定義する無関係なクラスが多数ある場合は、インターフェースを定義し、クラスにそのインターフェースを定義させる必要があります。
interface IMyInterface
{
void MyFunction();
}
void MyMethod(Object obj)
{
var o = obj as IMyInterface;
if (o != null)
o.MyFunction();
}
実際の型へのキャストは簡単です:
void MyMethod(Object obj) {
ActualType actualyType = (ActualType)obj;
}