using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Load += Form1_Load;
}
void Form1_Load(object sender, EventArgs e)
{
var list = GetSource().ToList();
this.comboBox1.SetDataSource(
list,
_ => _.Key,
_ => _.Value);
}
Dictionary<string, Assembly> GetSource()
{
return AppDomain.CurrentDomain.GetAssemblies()
.ToDictionary(x => x.FullName, x => x);
}
}
public static class Ex
{
public static void SetDataSource<T, TDisplayMember, TValueMember>(
this ComboBox @this, IList<T> dataSource,
Expression<Func<T, TDisplayMember>> displayMember,
Expression<Func<T, TValueMember>> valueMember)
{
// _ => _.Key
// ^^^^^ この部分を取得
var displayMemberBody = displayMember.Body as MemberExpression;
if (displayMemberBody == null) throw new ArgumentException();
// _ => _.Value
// ^^^^^^^ 同様にこの部分を取得
var valueMemberBody = valueMember.Body as MemberExpression;
if (valueMemberBody == null) throw new ArgumentException();
@this.DataSource = dataSource;
@this.DisplayMember = displayMemberBody.Member.Name;
@this.ValueMember = valueMemberBody.Member.Name;
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5MaW5xLkV4cHJlc3Npb25zOwp1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKdXNpbmcgU3lzdGVtLldpbmRvd3MuRm9ybXM7CgpuYW1lc3BhY2UgV2luZG93c0Zvcm1zQXBwbGljYXRpb24xCnsKICAgIHB1YmxpYyBwYXJ0aWFsIGNsYXNzIEZvcm0xIDogRm9ybQoJewoJCXB1YmxpYyBGb3JtMSgpCgkJewoJCQlJbml0aWFsaXplQ29tcG9uZW50KCk7CgoJCQl0aGlzLkxvYWQgKz0gRm9ybTFfTG9hZDsKCQl9CgoJCXZvaWQgRm9ybTFfTG9hZChvYmplY3Qgc2VuZGVyLCBFdmVudEFyZ3MgZSkKCQl7CgkJCXZhciBsaXN0ID0gR2V0U291cmNlKCkuVG9MaXN0KCk7CgoJCQl0aGlzLmNvbWJvQm94MS5TZXREYXRhU291cmNlKAoJCQkJbGlzdCwKCQkJCV8gPT4gXy5LZXksCgkJCQlfID0+IF8uVmFsdWUpOwoJCX0KCgkJRGljdGlvbmFyeTxzdHJpbmcsIEFzc2VtYmx5PiBHZXRTb3VyY2UoKQoJCXsKCQkJcmV0dXJuIEFwcERvbWFpbi5DdXJyZW50RG9tYWluLkdldEFzc2VtYmxpZXMoKQoJCQkJLlRvRGljdGlvbmFyeSh4ID0+IHguRnVsbE5hbWUsIHggPT4geCk7CgkJfQoJfQoKCXB1YmxpYyBzdGF0aWMgY2xhc3MgRXgKCXsKCQlwdWJsaWMgc3RhdGljIHZvaWQgU2V0RGF0YVNvdXJjZTxULCBURGlzcGxheU1lbWJlciwgVFZhbHVlTWVtYmVyPigKCQkJdGhpcyBDb21ib0JveCBAdGhpcywgSUxpc3Q8VD4gZGF0YVNvdXJjZSwKCQkJRXhwcmVzc2lvbjxGdW5jPFQsIFREaXNwbGF5TWVtYmVyPj4gZGlzcGxheU1lbWJlciwKCQkJRXhwcmVzc2lvbjxGdW5jPFQsIFRWYWx1ZU1lbWJlcj4+IHZhbHVlTWVtYmVyKQoJCXsKCgkJCS8vIF8gPT4gXy5LZXkKCQkJLy8gICAgICBeXl5eXiDjgZPjga7pg6jliIbjgpLlj5blvpcKCQkJdmFyIGRpc3BsYXlNZW1iZXJCb2R5ID0gZGlzcGxheU1lbWJlci5Cb2R5IGFzIE1lbWJlckV4cHJlc3Npb247CgkJCWlmIChkaXNwbGF5TWVtYmVyQm9keSA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oKTsKCgkJCS8vIF8gPT4gXy5WYWx1ZQoJCQkvLyAgICAgIF5eXl5eXl4g5ZCM5qeY44Gr44GT44Gu6YOo5YiG44KS5Y+W5b6XCgkJCXZhciB2YWx1ZU1lbWJlckJvZHkgPSB2YWx1ZU1lbWJlci5Cb2R5IGFzIE1lbWJlckV4cHJlc3Npb247CgkJCWlmICh2YWx1ZU1lbWJlckJvZHkgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCk7CgoJCQlAdGhpcy5EYXRhU291cmNlID0gZGF0YVNvdXJjZTsKCQkJQHRoaXMuRGlzcGxheU1lbWJlciA9IGRpc3BsYXlNZW1iZXJCb2R5Lk1lbWJlci5OYW1lOwoJCQlAdGhpcy5WYWx1ZU1lbWJlciA9IHZhbHVlTWVtYmVyQm9keS5NZW1iZXIuTmFtZTsKCQl9Cgl9Cn0K