Обработка метода C#, который не определяется на динамическом объекте (иначе respond_to/method_missing)

Берет camelCaseWord или PascalCaseWord и "wordifies" это, т.е. camelCaseWord =>, Camel-регистр Word

public static string Wordify( this string camelCaseWord )
{
    // if the word is all upper, just return it
    if( !Regex.IsMatch( camelCaseWord, "[a-z]" ) )
        return camelCaseWord;

    return string.Join( " ", Regex.Split( camelCaseWord, @"(?<!^)(?=[A-Z])" ) );
}

, с которым я часто использую его в conjuction, Использует для своей выгоды

public static string Capitalize( this string word )
{
    return word[0].ToString( ).ToUpper( ) + word.Substring( 1 );
}

использование В качестве примера

SomeEntityObject entity = DataAccessObject.GetSomeEntityObject( id );
List<PropertyInfo> properties = entity.GetType().GetPublicNonCollectionProperties( );

// wordify the property names to act as column headers for an html table or something
List<string> columns = properties.Select( p => p.Name.Capitalize( ).Wordify( ) ).ToList( );

Свободный использовать в codeplex проекте

8
задан Kyle Kaitan 10 July 2009 в 17:50
поделиться

1 ответ

Безусловно. Либо реализуйте IDynamicMetaObjectProvider , либо унаследуйте от DynamicObject для гораздо более простого маршрута. См. Несколько хороших примеров в документации DLR .

Вот быстрый пример DynamicObject :

using System;
using System.Dynamic;

public class MyDynamic : DynamicObject
{
    public override bool TryInvokeMember
        (InvokeMemberBinder binder,
         object[] args,
         out object result)
    {
        Console.WriteLine("I would have invoked: {0}",
                          binder.Name);
        result = "dummy";
        return true;
    }

    public string NormalMethod()
    {
        Console.WriteLine("In NormalMethod");
        return "normal";
    }
}

class Test
{
    static void Main()
    {
        dynamic d = new MyDynamic();
        Console.WriteLine(d.HelloWorld());
        Console.WriteLine(d.NormalMethod());
    }
}

У меня есть более крупный пример DynamicObject в 2-м издании C # in Depth , но я еще не реализовал IDyamicMetaObjectProvider . Я сделаю это до выхода книги, но в выпуске раннего доступа на данный момент есть только пример DynamicObject . Кстати, если купишь сегодня за полцены - используйте код twtr0711 . Позже я отредактирую этот ответ, чтобы удалить этот бит :)

17
ответ дан 5 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: