Ben varsa:Nesne gerçek türüne nasıl dökülür?
void MyMethod(Object obj) { ... }
nasıl gerçek türüdür ne obj
yayınlayabilirsiniz? Gerçek türüne çevrim
Ben varsa:Nesne gerçek türüne nasıl dökülür?
void MyMethod(Object obj) { ... }
nasıl gerçek türüdür ne obj
yayınlayabilirsiniz? Gerçek türüne çevrim
sonra sadece fiili türünü biliyorsanız:
SomeType typed = (SomeType)obj;
typed.MyFunction();
gerçek tipini bilmiyorsanız, o zaman: gerçekten, yok hayır.
// 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();
kolaydır:
void MyMethod(Object obj) {
ActualType actualyType = (ActualType)obj;
}
Bu çok komik ... – Steve
Bu mantıksız. Aslında gerçek tipi bilmiyorsun. Bunu nasıl yapmalısın? –
sanmıyorum:
void MyMethod(Object obj, Type t)
{
var convertedObject = Convert.ChangeType(obj, t);
...
}
UPD: Bu sizin için işe yarayabilir
: En MyFunction()
yöntem bir sınıfın (ve onun soyundan) sadece tanımlanırsa
void MyMethod(Object obj)
{
if (obj is A)
{
A a = obj as A;
...
}
else if (obj is B)
{
B b = obj as B;
...
}
}
Bu gerçekten işe yaramaz bir cevaptır, oy kullanma hakkından mahrumdur. Nesne nesnesinin bir nesnenin yansıması, OP tarafından sorulduğu gibi, nesnenin "gerçek türünü" üretmeyecektir. Ayrıca, MyMethod mantığınız kusurludur çünkü obj A tipinde olabilir ve aynı zamanda B tipi de olabilir. Mantığınız "gerçek tip" (OP talep edildiği gibi) sağlamaz - uyumlu bir tip sağlar ve zorunlu olarak değil İstenen tipte. – Jazimov
Implement an interface to call your function in your method
interface IMyInterface
{
void MyinterfaceMethod();
}
IMyInterface MyObj = obj as IMyInterface;
if (MyObj != null)
{
MyMethod(IMyInterface MyObj);
}
, denemek
void MyMethod(Object obj)
{
var o = obj as MyClass;
if (o != null)
o.MyFunction();
}
Eğer aramak istediğiniz işlevi tanımlayan ilgisiz sınıflarında çok sayıda, bir arayüze tanımlayabilir ve sınıfları bu arayüz tanımlamak yapmalıdır var: Örneğin gerçek türüne
interface IMyInterface
{
void MyFunction();
}
void MyMethod(Object obj)
{
var o = obj as IMyInterface;
if (o != null)
o.MyFunction();
}
Cast bunu şimdi eğer türünü o abc isimli sınıftan yönlendirilmiştir. Bu şekilde işlevini çağırabilirsiniz:
(abc)(obj)).MyFunction();
bunu farklı bir şekilde yapılabilir işlevini bilmiyorsanız. Her zaman kolay değil. Ama bunu bir şekilde imzasıyla bulabilirsiniz. Durum buysa, bize bildirmelisiniz.
Benim durumumda AutoMapper iyi çalışıyor.
AutoMapper dinamik nesnelerden herhangi açık yapılandırmaya olmadan/bağlanabilirler:
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);
Benzer şekilde AutoMapper özellik isimlerinin anahtarları sıraya olacak, nesnelere sözlüklerden düz eşleştirebilirsiniz.
more info https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping
Derleme zamanında bilinen türden mi? – psubsee2003
Ve bundan ne elde etmeyi bekliyorsunuz? Lütfen ne elde etmeyi beklediğinizden ziyade, neyi başarmaya çalıştığınızı bize bildirin. –
@JonSkeet: Nesneden bir işlevi çağırmak istiyorum. Şu anda 'object.MyFunction(); ', gerçek nesnenin bu işleve sahip olduğunu bilmeme rağmen derlemiyor. –