3 Haziran 2018 Pazar

dynamic Tipi

Giriş
Açıklaması şöyle.
We can use dynamic type in places where we cannot tell the compiler in advance that
this is going to be my type. 
dynamic altta reflection kullanır.

dynamic yerine Object
dynamic yerine Object kullanmak zor olur çünkü Object'i başka bir tipe cast etmek gerekir.

dynamic yerine Generic
dynamic kullanmak yerine dynamic'i içeren nesneyi Generic yani T tipi alır hale getirmeyi de düşünebiliriz.

dynamic ve ExpandoObject
dynamic ve ExpandoObject sıklıkla beraber kullanılırlar.

Kullanım Yerleri

dynamic ile metod çağırma
dynamic bir arayüzü gerçekleştirmeyen ancak aynı imzaya sahip nesneler için kullanılabilir. Buna Duck Typing deniliyor. Nesneye dayalı tasarımda ise Adaptor Örüntüsü deniliyor.

Örnek
Elimizde bir arayüz ve bu arayüzü kullanan kod olsun.
interface IGreetable {
  string Greet();
} 

void PrintGreeting(IGreetable g) => Console.WriteLine(g.Greet());
Elimizde bu arayüzü gerçekleştirmeyen ancak aynı imzaya sahip bir sınıf olsun.
class Person {
    public string Greet() => "Hello!";
}
Şöyle yaparız. Bu sınıfın avantajı herhangi bir nesneye sarmalayabilmesi.
class GreetableWrapper : IGreetable
{
  private dynamic _wrapped;
  public GreetableWrapper(dynamic wrapped)
  {
     _wrapped = wrapped;
  }

  public string Greet()
  {
    return _wrapped.Greet();
  }
}
Kullanmak için şöyle yaparız.
PrintGreeting(new GreetableWrapper(new Person()));
Örnek
Şöyle yaparız.
// works perfectly!!!
dynamic foo = new { x=(Action)(() => Console.WriteLine("ok")) };
foo.x();
dynamic array
Farklı türlerden değişkenleri aynı array nesnesine şöyle yerleştiririz. Array'e generic tip tanımlamıyoruz.
dynamic[] myObjects = new dynamic[3];
myObjects[0] = 1;
myObjects[1] = "2";
myObjects[3] = "another string";
dynamic liste
Farklı türlerden değişkenleri aynı listeye şöyle yerleştiririz. Listeye generic tip tanımlıyoruz.
List<dynamic> dynamicList = new List<dynamic>();
string stringValue = "Akshay";
int intValue = 1;
dynamicList.Add(stringValue);
dynamicList.Add(intValue);
veya şöyle yaparız. Listeye generic tip tanımlamıyoruz.
ArrayList array = new ArrayList();
string stringValue = "Akshay";
int intValue = 1;
array.Add(stringValue);
array.Add(intValue);
dynamic property
Örnek
Elimizde şöyle bir kod olsun.
public class A
{
  public dynamic Data;

}
Bu sınıfı json ile dolduralım.
string json = @"{
                'data': {
                        'human': {
                            'name': 'Luke Skywalker',
                            'height': 5.6430448
                        }
                    }
                }
            ";

A a = new A()
{
  Data = json
};

dynamic dyn = JsonConvert.DeserializeObject(a.Data);
var data = dyn["data"];
var human = data["human"];
var name = human["name"].Value;

Console.WriteLine(name);
Çıktı olarak Luke Skywalker alırız.
Örnek
item nesnesi içindeki Fields alanı farklı tiplerde olsun ancak hepsinde Id alanı olsun. Şöyle yaparız.
foreach (var item in items) {
  dynamic itemProperty=item.Fields[fieldName];
  if (itemProperty.Id==searchValue) {   
    filtered.Add(item);
  }
}








Hiç yorum yok:

Yorum Gönder