Untuk saat ini masih belum didukung oleh kompiler Roslyn ...
Sampai sekarang, properti ekstensi tidak dianggap cukup berharga untuk dimasukkan dalam versi standar C # sebelumnya. C # 7 dan C # 8.0 telah melihat ini sebagai juara proposal tetapi belum dirilis, terutama karena bahkan jika sudah ada implementasi, mereka ingin memperbaikinya sejak awal.
Tapi itu akan ...
Ada item anggota ekstensi dalam daftar kerja C # 7 sehingga dapat didukung dalam waktu dekat. Status properti ekstensi saat ini dapat ditemukan di Github di bawah item terkait .
Namun, ada topik yang bahkan lebih menjanjikan yaitu "memperluas segalanya" dengan fokus terutama pada properti dan kelas statis atau bahkan bidang.
Apalagi Anda bisa menggunakan solusi
Seperti yang ditentukan dalam artikel ini , Anda dapat menggunakan TypeDescriptor
kemampuan untuk melampirkan atribut ke instance objek saat runtime. Namun, itu tidak menggunakan sintaks dari properti standar.
Ini sedikit berbeda dari hanya gula sintaksis yang menambahkan kemungkinan untuk mendefinisikan properti yang diperluas seperti
string Data(this MyClass instance)
sebagai alias untuk metode ekstensi
string GetData(this MyClass instance)
karena menyimpan data ke dalam kelas.
Saya berharap bahwa C # 7 akan memberikan segala fitur ekstensi lengkap (properti dan bidang), namun pada saat itu, hanya waktu yang akan mengatakan.
Dan jangan ragu untuk berkontribusi karena perangkat lunak masa depan akan datang dari komunitas.
Pembaruan: Agustus 2016
Ketika tim dotnet menerbitkan apa yang baru di C # 7.0 dan dari komentar Mads Torgensen :
Properti ekstensi: kami memiliki magang (brilian!) Menerapkannya selama musim panas sebagai percobaan, bersama dengan jenis anggota ekstensi lainnya. Kami tetap tertarik pada ini, tetapi ini adalah perubahan besar dan kami perlu merasa yakin bahwa itu layak dilakukan.
Tampaknya properti ekstensi dan anggota lainnya, masih merupakan kandidat yang baik untuk disertakan dalam rilis Roslyn di masa depan, tetapi mungkin bukan yang 7.0.
Pembaruan: Mei 2017
Anggota ekstensi telah ditutup sebagai duplikat dari semua masalah ekstensi yang ditutup juga. Diskusi utama sebenarnya tentang Jenis ekstensibilitas dalam arti luas. Fitur ini sekarang dilacak di sini sebagai proposal dan telah dihapus dari 7,0 tonggak sejarah .
Pembaruan: Agustus, 2017 - C # 8.0 fitur yang diusulkan
Meskipun masih tetap hanya fitur yang diusulkan , kami sekarang memiliki pandangan yang lebih jelas tentang apa yang akan menjadi sintaksnya. Ingatlah bahwa ini juga akan menjadi sintaks baru untuk metode ekstensi:
public interface IEmployee
{
public decimal Salary { get; set; }
}
public class Employee
{
public decimal Salary { get; set; }
}
public extension MyPersonExtension extends Person : IEmployee
{
private static readonly ConditionalWeakTable<Person, Employee> _employees =
new ConditionalWeakTable<Person, Employee>();
public decimal Salary
{
get
{
// `this` is the instance of Person
return _employees.GetOrCreate(this).Salary;
}
set
{
Employee employee = null;
if (!_employees.TryGetValue(this, out employee)
{
employee = _employees.GetOrCreate(this);
}
employee.Salary = value;
}
}
}
IEmployee person = new Person();
var salary = person.Salary;
Mirip dengan kelas parsial, tetapi dikompilasi sebagai kelas / jenis yang terpisah di majelis yang berbeda. Perhatikan bahwa Anda juga dapat menambahkan anggota dan operator statis dengan cara ini. Seperti disebutkan dalam podcast Mads Torgensen , ekstensi tidak akan memiliki status apa pun (sehingga tidak dapat menambahkan anggota instance pribadi ke kelas) yang berarti Anda tidak akan dapat menambahkan data instance pribadi yang ditautkan ke instance . Alasan yang digunakan untuk itu adalah menyiratkan untuk mengelola kamus internal dan itu bisa sulit (manajemen memori, dll ...). Untuk ini, Anda masih bisa menggunakan TypeDescriptor
/ ConditionalWeakTable
teknik yang dijelaskan sebelumnya dan dengan ekstensi properti, menyembunyikannya di bawah properti yang bagus.
Sintaks masih dapat berubah karena menyiratkan masalah ini . Misalnya, extends
dapat diganti dengan for
yang beberapa mungkin merasa lebih alami dan kurang terkait java.
Pembaruan Desember 2018 - Peran, Ekstensi, dan anggota antarmuka statis
Perpanjangan semuanya tidak berhasil mencapai C # 8.0, karena beberapa kelemahan dijelaskan sebagai akhir dari tiket GitHub ini . Jadi, ada eksplorasi untuk meningkatkan desain. Di sini , Mads Torgensen menjelaskan apa peran dan ekstensi dan bagaimana perbedaannya:
Peran memungkinkan antarmuka untuk diimplementasikan pada nilai-nilai spesifik dari tipe yang diberikan. Ekstensi memungkinkan antarmuka untuk diterapkan pada semua nilai dari jenis yang diberikan, dalam wilayah kode tertentu.
Hal ini dapat dilihat pada sepersekian proposal sebelumnya dalam dua kasus penggunaan. The sintaks baru untuk perpanjangan akan seperti ini:
public extension ULongEnumerable of ulong
{
public IEnumerator<byte> GetEnumerator()
{
for (int i = sizeof(ulong); i > 0; i--)
{
yield return unchecked((byte)(this >> (i-1)*8));
}
}
}
maka Anda akan dapat melakukan ini:
foreach (byte b in 0x_3A_9E_F1_C5_DA_F7_30_16ul)
{
WriteLine($"{e.Current:X}");
}
Dan untuk antarmuka statis :
public interface IMonoid<T> where T : IMonoid<T>
{
static T operator +(T t1, T t2);
static T Zero { get; }
}
Menambahkan properti ekstensi pada int
dan memperlakukan int
sebagai IMonoid<int>
:
public extension IntMonoid of int : IMonoid<int>
{
public static int Zero => 0;
}