Skip to content
This repository has been archived by the owner on Jan 24, 2021. It is now read-only.

Commit

Permalink
Merge pull request #373 from csainty/EnumerableDD
Browse files Browse the repository at this point in the history
Enumerable Dynamic Dictionary
  • Loading branch information
thecodejunkie committed Oct 28, 2011
2 parents f1d8d49 + 575df31 commit 55d8009
Show file tree
Hide file tree
Showing 2 changed files with 157 additions and 120 deletions.
247 changes: 133 additions & 114 deletions src/Nancy.Tests/Unit/DynamicDictionaryFixture.cs
Expand Up @@ -645,125 +645,144 @@ public void Should_support_dynamic_properties()
value.ShouldEqual(10);
}

[Fact]
public void Should_support_dynamic_casting_of_properties_to_ints()
{
//Given
dynamic parameters = new DynamicDictionary();
parameters.test = "10";
[Fact]
public void Should_support_dynamic_casting_of_properties_to_ints()
{
//Given
dynamic parameters = new DynamicDictionary();
parameters.test = "10";

// When
var value = (int)parameters.test;

// Then
value.ShouldEqual(10);
}
// When
var value = (int)parameters.test;

[Fact]
public void Should_support_dynamic_casting_of_properties_to_guids()
{
//Given
dynamic parameters = new DynamicDictionary();
var guid = Guid.NewGuid();
parameters.test = guid.ToString();

// When
var value = (Guid)parameters.test;

// Then
value.ShouldEqual(guid);
}


[Fact]
public void Should_support_dynamic_casting_of_properties_to_timespans()
{
//Given
dynamic parameters = new DynamicDictionary();
parameters.test = new TimeSpan(1, 2, 3, 4).ToString();

// When
var value = (TimeSpan)parameters.test;

// Then
value.ShouldEqual(new TimeSpan(1, 2, 3, 4));
}

[Fact]
public void Should_support_dynamic_casting_of_properties_to_datetimes()
{
//Given
dynamic parameters = new DynamicDictionary();

parameters.test = new DateTime(2001, 3, 4);

// When
var value = (DateTime)parameters.test;

// Then
value.ShouldEqual(new DateTime(2001, 3, 4));
}


[Fact]
public void Should_support_dynamic_casting_of_nullable_properties()
{
//Given
dynamic parameters = new DynamicDictionary();
var guid = Guid.NewGuid();
parameters.test = guid.ToString();

// When
var value = (Guid?)parameters.test;

// Then
value.ShouldEqual(guid);
}

[Fact]
public void Should_support_implicit_casting()
{
// Given
dynamic parameters = new DynamicDictionary();

parameters.test = "10";

// When
int value = parameters.test;

// Then
value.ShouldEqual(10);
}

[Fact]
public void Should_support_casting_when_using_indexer_to_set_values()
{
// Given
dynamic parameters = new DynamicDictionary();

parameters["test"] = "10";

// When
int value = parameters.test;

// Then
value.ShouldEqual(10);
}
// Then
value.ShouldEqual(10);
}

[Fact]
public void Should_support_GetDynamicMemberNames()
{
// Given
dynamic parameters = new DynamicDictionary();
[Fact]
public void Should_support_dynamic_casting_of_properties_to_guids()
{
//Given
dynamic parameters = new DynamicDictionary();
var guid = Guid.NewGuid();
parameters.test = guid.ToString();

parameters["test"] = "10";
parameters["rest"] = "20";
// When
var value = (Guid)parameters.test;

// Then
value.ShouldEqual(guid);
}

// When
var names = ((DynamicDictionary) parameters).GetDynamicMemberNames();

// Then
Assert.True(names.SequenceEqual(new[] {"test", "rest"}));
}
[Fact]
public void Should_support_dynamic_casting_of_properties_to_timespans()
{
//Given
dynamic parameters = new DynamicDictionary();
parameters.test = new TimeSpan(1, 2, 3, 4).ToString();

// When
var value = (TimeSpan)parameters.test;

// Then
value.ShouldEqual(new TimeSpan(1, 2, 3, 4));
}

[Fact]
public void Should_support_dynamic_casting_of_properties_to_datetimes()
{
//Given
dynamic parameters = new DynamicDictionary();

parameters.test = new DateTime(2001, 3, 4);

// When
var value = (DateTime)parameters.test;

// Then
value.ShouldEqual(new DateTime(2001, 3, 4));
}


[Fact]
public void Should_support_dynamic_casting_of_nullable_properties()
{
//Given
dynamic parameters = new DynamicDictionary();
var guid = Guid.NewGuid();
parameters.test = guid.ToString();

// When
var value = (Guid?)parameters.test;

// Then
value.ShouldEqual(guid);
}

[Fact]
public void Should_support_implicit_casting()
{
// Given
dynamic parameters = new DynamicDictionary();

parameters.test = "10";

// When
int value = parameters.test;

// Then
value.ShouldEqual(10);
}

[Fact]
public void Should_support_casting_when_using_indexer_to_set_values()
{
// Given
dynamic parameters = new DynamicDictionary();

parameters["test"] = "10";

// When
int value = parameters.test;

// Then
value.ShouldEqual(10);
}

[Fact]
public void Should_support_GetDynamicMemberNames()
{
// Given
dynamic parameters = new DynamicDictionary();

parameters["test"] = "10";
parameters["rest"] = "20";

// When
var names = ((DynamicDictionary)parameters).GetDynamicMemberNames();

// Then
Assert.True(names.SequenceEqual(new[] { "test", "rest" }));
}

[Fact]
public void Should_be_able_to_enumerate_keys()
{
// Given
dynamic parameters = new DynamicDictionary();

parameters["test"] = "10";
parameters["rest"] = "20";

// When
var names = new List<string>();
foreach (var name in parameters) {
names.Add(name);
}

// Then
Assert.True(names.SequenceEqual(new[] { "test", "rest" }));
}
}
}
30 changes: 24 additions & 6 deletions src/Nancy/DynamicDictionary.cs
@@ -1,10 +1,11 @@
namespace Nancy
{
using System;
using System.Collections;
using System.Collections.Generic;
using System.Dynamic;

public class DynamicDictionary : DynamicObject, IEquatable<DynamicDictionary>, IHideObjectMembers
public class DynamicDictionary : DynamicObject, IEquatable<DynamicDictionary>, IHideObjectMembers, IEnumerable<string>
{
private readonly Dictionary<string, object> dictionary =
new Dictionary<string, object>(StaticConfiguration.CaseSensitive ? StringComparer.InvariantCulture : StringComparer.InvariantCultureIgnoreCase);
Expand Down Expand Up @@ -65,12 +66,29 @@ public override bool TryGetMember(GetMemberBinder binder, out object result)
}

/// <summary>
/// Returns the enumeration of all dynamic member names. </summary>
/// Returns the enumeration of all dynamic member names.
/// </summary>
/// <returns>A <see cref="IEnumerable{T}"/> that contains dynamic member names.</returns>
public override IEnumerable<string> GetDynamicMemberNames()
{
return dictionary.Keys;
}
{
return dictionary.Keys;
}

/// <summary>
/// Returns the enumeration of all dynamic member names.
/// </summary>
/// <returns>A <see cref="IEnumerable{T}"/> that contains dynamic member names.</returns>
public IEnumerator<string> GetEnumerator() {
return dictionary.Keys.GetEnumerator();
}

/// <summary>
/// Returns the enumeration of all dynamic member names.
/// </summary>
/// <returns>A <see cref="IEnumerator"/> that contains dynamic member names.</returns>
IEnumerator IEnumerable.GetEnumerator() {
return dictionary.Keys.GetEnumerator();
}

/// <summary>
/// Gets or sets the <see cref="DynamicDictionaryValue"/> with the specified name.
Expand Down

0 comments on commit 55d8009

Please sign in to comment.